Postgres SQL 中“-> >”和“->”的区别是什么?

在 SQL 中,->>->的区别是什么?

在这个线程(检查 json 类型列 postgreql 中是否存在字段)中,答案基本上建议使用,

json->'attribute' is not null

而不是,

json->>'attribute' is not null

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

75273 次浏览

->返回 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

PostgreSQL 提供了两个本机操作符 ->->>来帮助您查询 JSON 数据。

操作符 ->将 JSON 对象字段作为 JSON 返回。 操作符 ->>将 JSON 对象字段作为文本返回。

以下查询使用操作符 ->以 JSON 格式获取所有客户:

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

以下查询使用操作符 ->>以文本形式获取所有客户:

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

你可在以下连结找到更多资料 Http://www.postgresqltutorial.com/postgresql-json/

Postgres 提供了两个运算符来获得一个 JSON 成员:

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

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

  • (null) postgres null 类型
  • Null json/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 对象,唯一的字段 member无效
  2. 包含一个 JSONB 对象,并且唯一的字段 member具有数值 12
  3. < strong > (null) : 也就是说,整个列是 < strong > (null) ,根本不包含 JSONB 对象

为了更好地理解这些差异,让我们看看类型和 null 检查:

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;

产出:

身份证 箭头 Arrow _ pg _ type Arrow _ is _ null Dbl _ Arrow Dbl _ Arrow _ pg _ type Dbl _ Arrow _ is _ null 是 _ json _ null
1 无效 Jsonb 假的 (无) 短信 没错 没错
2 12 Jsonb 假的 12 短信 假的 假的
3 (无) Jsonb 没错 (无) 短信 没错 假的

备注:

  • {"member": null}:
    • val -> 'member' IS NULL假的
    • val ->> 'member' IS NULL是真的
  • is_json_null可以用来得到 只有的 json-无效条件