在 postgresql 中使用 jsonb_insert 时出现无效令牌错误

Invalid token error when using jsonb_insert in postgresql

作为一点背景。我想使用其他列的值用 jsonb 值填充一列。最初,我使用了这个查询:

UPDATE myTable
SET column_name = 
 row_to_json(rowset)
 FROM (SELECT column1, column2 FROM myTable)rowset

但是,这个查询似乎 运行 在一个有 900 万条记录的数据集上持续了太长时间(在我停止它之前的几个小时)。所以我用第二个 FROM 子句寻找解决方案并找到了 jsonb_insert 函数。为了测试查询,我首先 运行 这个示例查询:

SELECT jsonb_insert('{}','{column1}','500000')

给出 {'column1':500000} 作为输出。完美,所以我尝试使用实际列填充值:

SELECT jsonb_insert('{}':,'{column1}',column1) FROM myTable WHERE id = <test_id>

这给出了语法错误和添加参数类型的建议,这导致我得出以下结论:

SELECT jsonb_insert('{}':,'{column1}','column1') 
FROM myTable WHERE id = <test_id>

SELECT jsonb_insert('{}'::jsonb,'{column1}'::jsonb,column1::numeric(8,0)) 
FROM myTable WHERE id = <test_id>

这两个查询都给出了无效的输入类型语法错误,令牌 'column1' 无效。

我似乎真的无法使用文档找到这些查询的正确语法。有谁知道正确的语法是什么?

因为 jsonb_insert 函数可能需要为 new_value 参数使用 jsonb 类型

jsonb_insert(target jsonb, path text[], new_value jsonb [, insert_after boolean])

如果我们想获取JSON的数字类型,我们可以尝试在转换前将列转换为字符串类型jsonb

如果我们想得到一个JSON类型的字符串,可以尝试使用concat函数加上double-quotes符号。

CREATE TABLE myTable (column1 varchar(50),column2 int);

INSERT INTO myTable  VALUES('column1',50000);

SELECT jsonb_insert('{}','{column1}',concat('"',column1,'"')::jsonb) as JsonStringType,
       jsonb_insert('{}','{column2}',coalesce(column2::TEXT,'null')::jsonb) as JsonNumberType
FROM myTable 

sqlfiddle

备注

如果我们的列值可能为空,我们可以尝试将 'null' 用于 coalesce 函数作为 coalesce(column2::TEXT,'null').