我正在尝试将 varchar 类型列中的列更新为 JSON,但该列已填充为数字、字符串或哈希的字符。
我怎样才能将它们转换为接下来的 JSONTO_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;
Run Code Online (Sandbox Code Playgroud)
结果返回:
“39.9”
“32.2”
“Paso 5”
"{\"cam_in\": 0.6, \"cam_out\": 0.6}”
Run Code Online (Sandbox Code Playgroud)
该数值也被视为字符串,我希望他们进入integer,float等等。并且我期待同列是这样的:
39.9
32.2
“paso 5 ”
"{\"cam_in\": 0.6, \"cam_out\": 0.6}”
Run Code Online (Sandbox Code Playgroud)
我已经尝试过使用 when 语句和 SQL 的 try and catch 。这是一个 sql fiddle 来显示我的问题http://sqlfiddle.com/#!17/7073d/2
TO_JSON 将 Postgres 类型转换为 JSON 表示:
以 JSON 形式返回值。数组和组合被(递归地)转换为数组和对象;否则,如果存在从类型到 json 的强制转换,则将使用强制转换函数来执行转换;否则,将生成 JSON 标量值。对于数字、布尔值或空值以外的任何标量类型,将使用文本表示形式,正确引用和转义,使其成为有效的 JSON 字符串。
因此,您的字符串将转换为 JSON 字符串。您应该改用强制转换,并且只需一个语句即可完成转换和表修改:
ALTER TABLE data_copy1 ALTER data TYPE JSONB USING data::JSONB
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
我发现使用这段代码我的问题得到了解决,但它只能通过编程方式在我们的数据库上工作,我愿意阅读其他解决方案:)