【问题标题】:Iterating over postgres jsonb column迭代 postgres jsonb 列
【发布时间】:2022-08-18 00:12:57
【问题描述】:

例如,如果我有一个没有键值对的 jsonb 列: 例如

SomeColumn: [\"ONE\",\"TWO\",\"THREE\"]

我想将列中的数据迁移到migrationEnumObject,例如

MigrationEnumObject = {\"ONE\": \"1\", \"TWO\": \"1\", \"THREE\": \"3\"}

起点: SomeColumn: [\"ONE\",\"TWO\",\"THREE\"] 想要的结果:SomeColumn: [\"1\",\"2\",\"3\"] 我该怎么办?我是一个使用更复杂的 sql jsonb 函数的初学者,我能找到的所有示例都依赖于 jsonb 列中的键值对结构才能使用 json.set。由于这只是一个字符串数组,我找不到任何关于如何使用 sql 脚本将这些数据从起点迁移到所需结果的示例,例如直接通过 dbeaver。

    标签: sql postgresql jsonb


    【解决方案1】:

    如果您在表some_table 中有一个名为some_column 类型为jsonb 的列,其值为'["ONE","TWO","THREE"]',那么您可以使用查询处理数组项:

    select some_column->>0, some_column->>1, some_column->>2 from some_table
    

    然后您可以使用此查询的结果来映射新值并构建新的 jsonb 数组,如下所示:

    select json_build_array('1', '2', '3')
    

    更新

    生成的脚本可能是这样的:

    select array_to_json(array_remove(array[a, b, c], null)) from (select
    (case some_column->>0 when 'ONE' then '1' when 'TWO' then '2' when 'THREE' then '3' end) a,
    (case some_column->>1 when 'ONE' then '1' when 'TWO' then '2' when 'THREE' then '3' end) b,
    (case some_column->>2 when 'ONE' then '1' when 'TWO' then '2' when 'THREE' then '3' end) c
    from some_table) as base
    

    【讨论】:

    • 我可能误解了您的解决方案,但我正在寻找一种动态方法来更改例如 100 个 some_column 类型的列,其中包含排序为“ONE”、“TWO”、“THREE”的任意字符串,因此例如某些列可能仅包含[“ONE”],您描述的方式只能让我一次手动更改一列,还是我理解错误?
    • 这是一个示例,如果我使用带有键值对的对象结构,我可以让它工作,我想对上面提到的结构做同样的事情:dbfiddle.uk/…
    • 好的,我在答案中添加了一个完整的脚本,应该可以满足您的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多