json PostgreSQL中`->>`和`->`有什么区别?

zphenhs4  于 2023-03-31  发布在  PostgreSQL
关注(0)|答案(4)|浏览(371)

SQL中的->>->有什么区别?
在这个线程(Check if field exists in json type column postgresql)中,回答者基本上建议使用,

json->'attribute' is not null

作为替代,

json->>'attribute' is not null

为什么用单箭头而不是双箭头?以我有限的经验,两者都做同样的事情。

aamkag61

aamkag611#

->返回json(或jsonb),->>返回text

with t (jo, ja) as (values
    ('{"a":"b"}'::jsonb,('[1,2]')::jsonb)
)
select
    pg_typeof(jo -> 'a'), pg_typeof(jo ->> 'a'),
    pg_typeof(ja -> 1), pg_typeof(ja ->> 1)
from t
;
 pg_typeof | pg_typeof | pg_typeof | pg_typeof 
-----------+-----------+-----------+-----------
 jsonb     | text      | jsonb     | text
pexxcrt2

pexxcrt22#

PostgreSQL提供了两个原生运算符->->>来帮助您查询JSON数据。
运算符->将JSON对象字段返回为JSON。运算符->>将JSON对象字段返回为文本。
以下查询使用运算符->以JSON格式获取所有客户:

SELECT
 info -> 'customer' AS customer
FROM
 orders;
customer
--------
"John Doe"
"Lily Bush"
"Josh William"
"Mary Clark"

下面的查询使用运算符->>以文本的形式获取所有客户:
一个二个一个一个
您可以在下面的链接中查看更多详细信息http://www.postgresqltutorial.com/postgresql-json/

qv7cva1a

qv7cva1a3#

Postgres提供了2个操作符来获取JSON成员:

  • 箭头操作符:->返回JSON或JSONB类型
  • 双箭头操作符:->>返回类型文本

我们还必须明白,我们现在有两种不同的null

****(null)***postgres null类型
*nulljson/B null类型

我在jsfiddle上创建了一个示例
让我们创建一个带有JSONB字段的简单表:

create table json_test (
  id integer,
  val JSONB
);

并插入一些测试数据:

INSERT INTO json_test (id, val) values
(1, jsonb_build_object('member', null)),
(2, jsonb_build_object('member', 12)),
(3, null);

我们在sqlfiddle中看到的输出:

id  | val
----+-----------------
 1  | {"member": null}
 2  | {"member": 12}
 3  | (null)

备注:
1.包含JSONB对象,唯一的字段membernull
1.包含一个JSONB对象,唯一的字段member具有数值12
1.为***(null)***:即整个列为***(null)***,并且根本不包含JSONB对象
为了更好地理解差异,让我们看看类型和空值检查:

SELECT id,
  val -> 'member'  as arrow,
  pg_typeof(val -> 'member')  as arrow_pg_type,
  val -> 'member' IS NULL as arrow_is_null,
  val ->> 'member' as dbl_arrow,
  pg_typeof(val ->> 'member')  as dbl_arrow_pg_type,
  val ->> 'member' IS NULL as dbl_arrow_is_null,
  CASE WHEN jsonb_typeof(val -> 'member') = 'null' THEN true ELSE false END as is_json_null
from json_test;

输出:
| 身份证|箭|箭头pg型|arrow_is_null|dbl_arrow|dbl_arrow_pg_type|dbl_arrow_is_null|是_json_空|
| --------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|
| 1|零|JSONB|假的|(无)|正文|真|真|
| 第二章|十二岁|JSONB|假的|十二岁|正文|假的|假的|
| 三|(无)|JSONB|真|(无)|正文|真|假的|
备注:

  • 对于{"member": null}
  • val -> 'member' IS NULLfalse
  • val ->> 'member' IS NULL为真
  • is_json_null可以用来获取onlyjson-null条件
c9qzyr3d

c9qzyr3d4#

这里已经回答过几次了,单箭头->用于直接访问JSON。双箭头->>用于访问 * 和 * 转换。
记住这一点的关键是:

*->短箭头表示工作量更少:它只做一件事一箭一物:访问JSON
***->>**长箭头表示你需要输入更多的内容,postgres需要做更多的工作:两个箭头,两件事:访问JSON并将其转换为文本

相关问题