首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么JSON元素不是文本时返回文本?

为什么JSON元素不是文本时返回文本?
EN

Database Administration用户
提问于 2017-03-23 19:34:18
回答 1查看 2.1K关注 0票数 4

当我尝试使用->>'elementName'访问JSON元素时,我会得到一个text类型。

代码语言:javascript
复制
SELECT pg_typeof(x1->>'a'), jsonb_typeof(x2)
FROM ( VALUES
  ('{"a":5}'::jsonb, '5'::jsonb)
) AS t(x1,x2);

 pg_typeof | jsonb_typeof 
-----------+--------------
 text      | number
(1 row)

然而,jsonb表示它将数字映射到数字类型。..。

当将文本JSON输入转换为jsonb时,RFC 7159描述的原始类型有效地映射到本机PostgreSQL类型,如表8-23所示。

这是从文档中复制的表格,

表8-23.JSON原语类型和相应的PostgreSQL类型

代码语言:javascript
复制
JSON primitive type     PostgreSQL type  Notes
string                  text             \u0000 is disallowed, as are non-ASCII Unicode escapes if database encoding is not UTF8
number                  numeric          NaN and infinity values are disallowed
boolean                 boolean          Only lowercase true and false spellings are accepted
null                    (none)           SQL NULL is a different concept
EN

回答 1

Database Administration用户

回答已采纳

发布于 2017-03-23 19:34:18

目前无法访问内部JSON类型。上面引用的文档只提到了它们是如何存储的。有一个PostgreSQL中的伪类型anyelement,但是不能返回那个类型。函数是多态的,因为它们接受不同的类型,但它们必须返回指定的类型。

对于不同的类型,运算符可能会被重载,但目前情况并非如此。目前->>定义为

代码语言:javascript
复制
Operator    Right Operand Type  Description
->>         text                Get JSON object field as text

这意味着无论如何存储类型,都必须通过text才能访问它。所有jsonb操作符都返回jsonbtext

考虑到歧义,即使类型超载,这将如何处理。

代码语言:javascript
复制
SELECT pg_typeof(x1->>'a'), jsonb_typeof(x2)
FROM ( VALUES
  ('{"a":5}'::jsonb, '5'),
  ('{"a":true}'::jsonb, 'true'::jsonb)
) AS t(x1,x2);

如果这有道理的话..。那这个能做什么..。

代码语言:javascript
复制
SELECT sum(x1->>'a')
FROM ( VALUES
  ('{"a":5}'::jsonb, '5'),
  ('{"a":true}'::jsonb, 'true'::jsonb)
) AS t(x1,x2);

虽然重载->>可能会提高系统的效率,但也会使系统变得更加复杂。

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

https://dba.stackexchange.com/questions/168029

复制
相关文章

相似问题

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