我已经阅读了文档,似乎没有可辨别的方式来执行将ALTER TABLE ... ALTER COLUMN ... USING
语句直接将json
类型列转换为类型的语句hstore
。没有可用的功能(我知道)可以执行转换。
我拥有的下一个最佳选择是创建一个新的typehstore
列,使用一些外部工具将JSON数据复制到该新列,删除旧json
列,并将新hstore
列重命名为旧列的名称。
有没有更好的办法?
到目前为止,我有:
$ CREATE TABLE blah (unstructured_data JSON);
$ ALTER TABLE blah ALTER COLUMN unstructured_data
TYPE hstore USING CAST(unstructured_data AS hstore);
ERROR: cannot cast type json to hstore
不幸的是,PostgreSQL在(f.ex.子查询是不允许的)USING
子句中不允许所有类型的表达式ALTER TABLE ... SET DATA TYPE ...
。
但是,您可以编写函数来克服此问题,您只需要决定对高级类型(在对象的值中)进行处理,例如数组和对象。这是一个示例,将它们简单地转换为字符串:
CREATE OR REPLACE FUNCTION my_json_to_hstore(json)
RETURNS hstore
IMMUTABLE
STRICT
LANGUAGE sql
AS $func$
SELECT hstore(array_agg(key), array_agg(value))
FROM json_each_text($1)
$func$;
之后,您可以在中使用它ALTER TABLE
,例如:
ALTER TABLE blah
ALTER COLUMN unstructured_data
SET DATA TYPE hstore USING my_json_to_hstore(unstructured_data);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句