首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从JSON提取一个int、string、boolean等作为其对应的PostgreSQL类型

从JSON提取一个int、string、boolean等作为其对应的PostgreSQL类型
EN

Stack Overflow用户
提问于 2015-02-13 23:34:01
回答 2查看 9.6K关注 0票数 8

我觉得这里一定遗漏了一些简单的东西,但是我已经阅读了PostgreSQL关于JSON以及JSON操作符和函数的文档,没有看到任何解释它的东西。

在PostgreSQL中很容易将其转换为JSON:

代码语言:javascript
复制
SELECT *, pg_typeof(j) FROM (VALUES
(to_json(5)),
(to_json(true)),
(to_json('foo'::TEXT))
) x (j);

会给我一个很好的结果集,里面全是json的:

代码语言:javascript
复制
   j   | pg_typeof
-------+-----------
 5     | json
 true  | json
 "foo" | json

但是如何将这些json值转换回它们的原始类型呢?当然,我不希望在一个结果集中能够做到这一点,因为类型不一致。我的意思是个别的。

很多我试过的东西

铸造肯定不起作用:

代码语言:javascript
复制
SELECT to_json(5)::NUMERIC;

给出

代码语言:javascript
复制
ERROR:  cannot cast type json to numeric

如果我试图像这样滥用json_populate_record函数:

代码语言:javascript
复制
SELECT json_populate_record(null::INTEGER, to_json(5));

我得到了

代码语言:javascript
复制
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)也是如此:

代码语言:javascript
复制
SELECT * FROM json_to_record(to_json(5)) x (i INT);

我又犯了一个错误:

代码语言:javascript
复制
ERROR:  cannot call json_to_record on a scalar

那么,如何将json“标量”(显然是PG所称的)转换为相应的PG类型?

我对9.3和9.4感兴趣,9.2只是一个奖励。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-22 01:27:02

对于布尔和数字来说,最简单的方法似乎是先将数据转换为TEXT,然后转换为适当的类型:

代码语言:javascript
复制
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

这就留下了字符串,取而代之的是返回一个引用的值,尝试这样做:

代码语言:javascript
复制
SELECT j::TEXT
FROM (VALUES (to_json('foo'::TEXT))) x (j)
-- Result is "foo"

很显然,我问题的那一部分,已经被解决了。您可以通过将文本值包装在数组中,然后提取它来绕过它:

代码语言:javascript
复制
SELECT array_to_json(array[j])->>0
FROM (VALUES (to_json('foo'::TEXT))) x (j)
-- Result is foo, with column type TEXT.
票数 9
EN

Stack Overflow用户

发布于 2015-02-14 00:09:09

从本质上说,数据类型的底层位级表示是不兼容的,将标量转换为本机类型并不是因为所涉及的模棱两可而实现的。JSON有一个非常严格的规范,它紧密地对应于javascript对象和本机。

这是可能的,但我认为尚未实施。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28510543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档