0

我有一个 json 字符串'{"1001": "20", "1002": "30", "1003": "50"}',我用这个 select 语句把它变成了一个列

SELECT json_each_text (vdn_weight) as weightage 
FROM aa_dev.sdg_metadata;

图像1

现在我想把它转换成一个二维数组,这样逗号分隔的值就像

arr[1][1] = 1001

arr[1][2] = 1002

arr[1][3] = 1004

arr[2][1] = 20

arr[2][2] = 30

arr[2][3] = 50

我试图编写一个查询来更新上面的选择语句并删除圆括号

With CTE
AS
(SELECT json_each_text (vdn_weight) as weightage
FROM data )
UPDATE CTE
set CTE.weightage = regexp_replace(CTE.weightage, '[\(\) "]', '', 'g');

但是这个查询给了我一个错误

SQL Error [42P01]: ERROR: relation "cte" does not exist
  Position: 105

除了二维数组,还有什么更好的解决方案或更好的数据结构?我不能使用临时表或表。

4

1 回答 1

1

你不能UPDATE是 CTE,只有真正的桌子。

分步演示:db<>fiddle

SELECT
    array_agg(                                                    -- 3
        array[key, value]                                         -- 2
    )
FROM json_each_text('{"1001": "20", "1002": "30", "1003": "50"}') -- 1
  1. 当您json_each_text()在 FROM 列表中使用时,它会生成两列 (keyvalue) 而不是一个元组
  2. 将这些创建的列中的值一起放入一个数组中
  3. 将所有记录聚合成一个二维数组。

如果您想先将所有键放入一个数组,将所有值放入一个数组,然后再聚合这些数组(切换维度),那么当然必须切换操作:

演示:db<>小提琴

SELECT
    array[
        array_agg(key),
        array_agg(value)
    ]
FROM json_each_text('{"1001": "20", "1002": "30", "1003": "50"}')
于 2021-03-03T13:53:01.957 回答