当前位置: 首页 > 知识库问答 >
问题:

Postgres JSONB编辑列

邰胤
2023-03-14

我正在阅读Postgres Jsonb文档,但找不到解决我遇到的一个小问题的方法。

我有一张桌子:MY_TABLE

具有以下列:

用户、名称、数据和购买

需要注意的是,“数据”是一个jsonb,有多个字段。“Data”中的一个字段是“Attribute”,但它可以保存的值不同步。我的意思是,它可以是一个字符串,一个字符串列表,一个空列表,或者只是一个空字符串。然而,我想改变这一点。

我希望允许的唯一值是字符串列表和空列表。我想将所有空字符串转换为空列表,将常规字符串转换为字符串列表。

我曾尝试使用json\u build\u数组,但没有任何运气

例如,我希望我的最后一个jsonb看起来像:

       [{
           "Id": 1,
           "Attributes": ["Test"]

       },
       {
           "Id": 2,
           "Attributes": []

       },
{
           "Id": 3,
           "Attributes": []

       }]

从转换时

    {
        "Id": 1,
        "Attributes": "Test"

    },
{
           "Id": 2,
           "Attributes": ""

       },
{
           "Id": 3,
           "Attributes": []

       }
]

我只关心Json中的“Attributes”字段,而不关心任何其他字段。

我还想确保一些属性有一个空字符串"属性": "", 他们被映射到一个空列表,而不是一个空字符串列表([]不["])

我还想为已经持有空数组值的属性保留空数组值([])。

这是我到目前为止得到的:

jsonb_set(
    mycol,
    '{Attributes}',
    case when js ->> 'Attributes' <> '' 
        then jsonb_build_array(js ->> 'Attributes')
        else '[]'::jsonb
    end
)

但是,属性:[]正在映射到[“[]”

共有1个答案

商宝
2023-03-14

使用jsonb\u array\u elements()迭代每个“数据”单元的元素,并使用jsonb\u agg将变换值重新组合到一个数组中:

WITH test_data(js) AS (
    VALUES ($$ [
      {
        "Id": 1,
        "Attributes": "Test"
      },
      {
        "Id": 2,
        "Attributes": ""
      },
      {
        "Id": 3,
        "Attributes": []
      }
    ]
    $$::JSONB)
)
SELECT transformed_elem
FROM test_data
JOIN LATERAL (
    SELECT jsonb_agg(jsonb_set(
            elem,
            '{Attributes}',
            CASE
                WHEN elem -> 'Attributes' IN ('""', '[]')          THEN '[]'::JSONB
                WHEN jsonb_typeof(elem -> 'Attributes') = 'string' THEN jsonb_build_array(elem -> 'Attributes')
                ELSE elem -> 'Attributes'
            END
        )) AS transformed_elem
    FROM jsonb_array_elements(test_data.js) AS f(elem) -- iterate over every element in the array
) s
 ON TRUE

退货

[{"Id": 1, "Attributes": ["Test"]}, {"Id": 2, "Attributes": []}, {"Id": 3, "Attributes": []}]
 类似资料:
  • 在JavaFX 8中,我尝试在将新行添加到表中后编辑单元格,以优化用户体验。 选择了正确的行,但单元不会进入编辑模式。嗯,我很偶然地看到了这种情况,但很难再现。我做错了什么?

  •   复制 剪切 字符 y x 行 yy dd 需先在可视模式中选取 p 在光标后粘贴 P 在光标前粘贴 u 撤消 Ctrl+r 重做 Ctrl+y 逐字克隆上一行内容 Ctrl+e 逐字克隆下一行内容

  • 问题内容: 使用什么是能够编辑内容的最佳方法? 在我理想的情况下, 添加的 生日将是一个超链接,点击该链接将显示一个编辑表单-与带有更新按钮的当前添加表单相同。 实时预览(插播) HTML: App.js: 问题答案: 您应该将表单放在每个节点内,分别使用和启用和禁用编辑。像这样: 这里的关键点是: 我已将控件更改为本地范围 已添加到,因此我们可以在编辑时显示它 添加了带有的,以便在编辑时隐藏内容

  • Vim提供了许多命令,使编辑功能非常强大。 在本章中,将讨论以下主题内容 - 插入 附加 打开新行 替换 更改 更换 加入 1. 在光标前插入文本 要在光标之前插入文本执行以下步骤 - 打开Vim 切换到插入模式 在行的开头插入文本 假设位于行的中间,并且希望在当前行的开头插入文本,然后执行以下步骤 - 切换到命令模式 激活插入模式 此操作将光标移动到当前行的开头并在插入模式下切换Vim。 在光标

  • 概述 Sublime Text 有非常多的编辑功能,这里只能介绍一点皮毛。 多文本选择 多文本选择让你高效地修改文本,任何的赞美都无法形容它了,原因: 选择一些文本,按下Ctrl+D进行多选,如果想跳过当前项,按下Ctrl+K,Ctrl+D。 误选了按Ctrl+U撤销最后一次选中项。 多行选择合并成一行 Ctrl+L选中单行文本,Ctrl+Shift+L把多行选择变成单行选择的编辑状态。 列选择

  • 复制、粘贴、选择、查找、替换应该是我们在编写代码时最常用的操作了,Android Studio可以让这些操作变得简单和高效。

  • 基础 安装 扩展市场 任务 调试 为什么选用VSCode 版本控制 易用性 与时俱进的编辑体验

  • 因为要编辑项目需要的代码,所以你需要选择一款文本编辑器。不需要在挑选编辑器上花太多时间,一开始,您只需要一款现代的,使用简单的编辑器就行了。用你已经熟悉的,还没谱的话可以使用我推荐的 Atom 编辑器。 Atom Brackets Sublime Visual Studio Code