有时候,PostgreSQL从零开始,有时候则不是

首先

抱歉,这不是一篇从零开始学习PostgreSQL的入门文章。标题可能会引起误解。

由于这篇文章非常有趣,所以我想自己为它取个名字。

PostgreSQL的数组和JSON

在PostgreSQL中存在数组类型。
在基本规范化的数据库表中通常不会看到它,但是在需要破坏规范化以提高性能或编写复杂查询时,它非常有用,是一个相当酷的特性。

有一个叫做JSON类型和JSONB类型的东西也有类似的用法。这些类型与之前的类似,还可以有效地处理要将其视为JSON的数据,例如API响应数据。

JSONB具有很強的表達能力,可以創建各種不同的JSONB。
以下的查詢都可以生成JSONB。

-- {}
select '{}'::JSONB;
 jsonb
------
{}
(1 row)

-- 1
select '1'::JSONB;
 jsonb 
-------
1
(1 row)

select '[{"value":0}]'::JSONB;
 jsonb 
-------
[{"value": 0}]

select NULL::JSONB;
 jsonb 
-------
[NULL]

本题

当执行以下两个查询时,返回的值分别是什么?

-- クエリ1
select '[{"value":0},{"value":1},{"value":2}]'::JSONB->0;
-- クエリ2
select (array[0,1,2])[0];

答案是,第一个值为{“value”:0},第二个值为空值。

select '[{"value":0},{"value":1},{"value":2}]'::JSONB->0;
 jsonb 
-------
{"value": 0}

select (array[0,1,2])[0];
 jsonb 
-------
[NULL]

在PostgreSQL中,数组从1开始索引,而JSON数组从0开始索引。仔细考虑,一个语言中同时存在这两种方式真是非常了不起的。不过我不太想使用1索引来访问JavaScript Object Notation,但这也并没有什么问题。顺便问一下,PostgreSQL是否支持写入JSONB数组的数组呢?

select ((array['[{"value":0}]'::JSONB,'[{"value":1}]'::JSONB,'[{"value":2}]'::JSONB])[1])->0;
 jsonb 
-------
{"value": 0}

真是太难过了!

總結完

SELECT FROM オチ;
--
(1 rows)

给我不同的,只需要一种选择的中文释义:
花絮

-- JSONパスでも0始まり
select * from jsonb_path_query('[{"value":0},{"value":1},{"value":2}]'::JSONB, '$[0]');
 jsonb 
-------
{"value": 0}
广告
将在 10 秒后关闭
bannerAds