在 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
备注
如果我们的列值可能为空,我们可以尝试将 'null'
用于 coalesce
函数作为 coalesce(column2::TEXT,'null')
.
作为一点背景。我想使用其他列的值用 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
备注
如果我们的列值可能为空,我们可以尝试将 'null'
用于 coalesce
函数作为 coalesce(column2::TEXT,'null')
.