我觉得这里一定遗漏了一些简单的东西,但是我已经阅读了PostgreSQL关于JSON以及JSON操作符和函数的文档,没有看到任何解释它的东西。
在PostgreSQL中很容易将其转换为JSON:
SELECT *, pg_typeof(j) FROM (VALUES
(to_json(5)),
(to_json(true)),
(to_json('foo'::TEXT))
) x (j);会给我一个很好的结果集,里面全是json的:
j | pg_typeof
-------+-----------
5 | json
true | json
"foo" | json但是如何将这些json值转换回它们的原始类型呢?当然,我不希望在一个结果集中能够做到这一点,因为类型不一致。我的意思是个别的。
很多我试过的东西
铸造肯定不起作用:
SELECT to_json(5)::NUMERIC;给出
ERROR: cannot cast type json to numeric如果我试图像这样滥用json_populate_record函数:
SELECT json_populate_record(null::INTEGER, to_json(5));我得到了
ERROR: first argument of json_populate_record must be a row type在PG9.4中,我可以很容易地看出类型:SELECT json_typeof(to_json(5));给出了number,但这并不能帮助我实际提取它。
json_to_record (也是9.4)也是如此:
SELECT * FROM json_to_record(to_json(5)) x (i INT);我又犯了一个错误:
ERROR: cannot call json_to_record on a scalar那么,如何将json“标量”(显然是PG所称的)转换为相应的PG类型?
我对9.3和9.4感兴趣,9.2只是一个奖励。
发布于 2015-04-22 01:27:02
对于布尔和数字来说,最简单的方法似乎是先将数据转换为TEXT,然后转换为适当的类型:
SELECT j::TEXT::NUMERIC
FROM (VALUES ('5.4575e6'::json)) x (j)
-- Result is 5457500, with column type NUMERIC
SELECT j::TEXT::BOOLEAN
FROM (VALUES ('true'::json)) x (j)
-- Result is t, with column type BOOLEAN这就留下了字符串,取而代之的是返回一个引用的值,尝试这样做:
SELECT j::TEXT
FROM (VALUES (to_json('foo'::TEXT))) x (j)
-- Result is "foo"很显然,我问题的那一部分,已经被解决了。您可以通过将文本值包装在数组中,然后提取它来绕过它:
SELECT array_to_json(array[j])->>0
FROM (VALUES (to_json('foo'::TEXT))) x (j)
-- Result is foo, with column type TEXT.发布于 2015-02-14 00:09:09
从本质上说,数据类型的底层位级表示是不兼容的,将标量转换为本机类型并不是因为所涉及的模棱两可而实现的。JSON有一个非常严格的规范,它紧密地对应于javascript对象和本机。
这是可能的,但我认为尚未实施。
https://stackoverflow.com/questions/28510543
复制相似问题