将列从varchar更新为jsonb

时间:2018-04-07 19:02:02

标签: sql postgresql

我试图将varchar类型列中的列更新为JSON,但该列已经填入了数字或字符串或散列的字符我如何将它们转换为接下来的JSON TO_JSON

我尝试了什么

ALTER TABLE data_copy1 ADD COLUMN data2 jsonb;
UPDATE data_copy1 set data2= to_json(data);
ALTER TABLE data_copy1 DROP COLUMN data;
ALTER TABLE data_copy1 RENAME COLUMN data2 TO data;

返回结果:

“39.9”
“32.2”
“Paso 5”
"{\"cam_in\": 0.6, \"cam_out\": 0.6}”

数值也被视为字符串,我希望它们分为integerfloat等。我希望同一列可以是这样的:

39.9 
32.2
“paso 5 ”
"{\"cam_in\": 0.6, \"cam_out\": 0.6}” 

我已经尝试过使用when语句和SQL的try和catch。 这里显示我的问题http://sqlfiddle.com/#!17/7073d/2

是一个小问题

2 个答案:

答案 0 :(得分:0)

TO_JSON converts Postgres type to JSON representation

  

将值返回为JSON。数组和组合被转换(递归)到数组和对象;否则,如果从类型转换为json,则使用强制转换函数执行转换;否则,将生成JSON标量值。对于除数字,布尔值或空值之外的任何标量类型,将使用,正确引用和转义文本表示,以使其成为有效的JSON字符串。

因此,您的字符串将转换为JSON字符串。您应该使用强制转换,并且只需一个语句就可以进行转换和表修改:

ALTER TABLE data_copy1 ALTER data TYPE JSONB USING data::JSONB

答案 1 :(得分:0)

ALTER TABLE data_copy1 ADD COLUMN data2 jsonb;
UPDATE data_copy1 set data2= to_json(data) where LEFT(data, 1)= 'p' or LEFT(data, 1)= '{';
UPDATE data_copy1 set data2= to_json(data::numeric) where LEFT(data, 1)!= 'p' and LEFT(data, 1)!= '{';
ALTER TABLE data_copy1 DROP COLUMN data;
ALTER TABLE data_copy1 RENAME COLUMN data2 TO data;

我发现使用此代码我的问题已经解决了,但它只能通过编程的方式对我们的数据库起作用,我愿意阅读其他解决方案:)