派生型

JSONB

​ JSONB数据类型将JSON(JavaScript ObjectNotation)数据作为JSONB值的二进制存储,从而消除了空格,重复键和键顺序。JSONB支持反向索引。

别名

在InCloud ZNBASE中,JSON是 JSONB的别名。

语法

​ JSONB数据类型的语法遵循RFC8259中指定的格式。JSONB类型的常量值可以使用解释文本或使用JSONB类型注释的字符串文本来表示。

有六种类型的JSONB值:

  • null

  • Boolean

  • String

  • Number (i.e., decimal,不是标准 int64)

  • Array (即有序的JSONB值序列)

  • Object (即从字符串到JSONB值的映射)

例如:’{“type”: “account creation”, “username”: “harvestboy93”}’’{“first_name”: “Ernie”, “status”: “Looking for treats”, “location”: “Brooklyn”}’ 如果输入中包含重复键,则仅保留最后一个值。

类型转换

​ JSONB可以转换为STRING类型。

​ JSONB值的大小是可变的,但建议将值保持在1 MB以下以保证性能。 如果高于该阈值,写入放大和其他考虑因素可能导致明显的性能下降。

JSONB函数

下面是JSONB的一些常用函数:

  • jsonb_array_elements(<jsonb>)

​ 将JSONB数组扩展为一组JSONB值;

  • jsonb_build_object(<any_element>…)

    从可变参数列表构建一个JSONB对象,该列表在键和值之间交替;

  • jsonb_each(<jsonb>)

​ 将最外面的JSONB对象扩展为一组键值对;

  • jsonb_object_keys(<jsonb>)

    返回最外面的JSONB对象中的有序键的集合;

  • jsonb_pretty(<jsonb>)

    返回给定的JSONB值作为缩进的STRING,并带有换行符。

JSONB操作符

下面是JSONB的操作符:

类型描述示例
->访问JSONB字段,返回JSONB值。SELECT ‘{“foo”:”bar”}’::JSONB->’foo’ = ‘“bar”‘::JSONB;
->>访问JSONB字段,返回一个字符串。SELECT ‘{“foo”:”bar”}’::JSONB->>’foo’ = ‘bar’::STRING;
@>访问JSONB字段,返回一个字符串。SELECT (‘{“foo”: {“baz”: 3}, “bar”: 2}’::JSONB @> ‘{“foo”: {“baz”:3}}’::JSONB ) = true;
示例

示例1:使用JSONB列创建表

CREATE TABLE jsonbs ( id INT DEFAULT unique_rowid(), name JSONB, PRIMARY KEY(id) );

CREATE TABLE

SHOW COLUMNS FROM jsonbs;

column_name | data_type | is_nullable | column_default | generation_expression | indices | is_hidden

+——————-+—————-+——————-+————————+———————————-+—————-+—————-+

id | INT | false | unique_rowid() | | {primary} | false name |

JSONB | true | NULL | | {} | false

INSERT INTO jsonbs (name) VALUES (‘{“first_name”: “Lola”, “last_name”: “Dog”, “location”: “NYC”, “online” : true, “friends” : 547}’), (‘{“first_name”: “Ernie”, “status”: “Looking for treats”, “location” : “Brooklyn”}’);

INSERT 2

SELECT * FROM jsonbs;

id | name

+——————————+———————————————————————————————————————————————-+

519267222677684225 | {“first_name”: “Lola”, “friends”: 547, “last_name”: “Dog”, “location”: “NYC”, “online”: true} 519267222678110209 | {“first_name”: “Ernie”, “location”: “Brooklyn”, “status”: “Looking for treats”}

示例2:检索格式化的JSONB数据:要使用更易于阅读的格式检索JSONB数据,请使用jsonb_pretty()函数。例如,在示例1中创建的表中检索数据:

SELECT id, jsonb_pretty(name) FROM jsonbs;

id | jsonb_pretty

+——————————+——————————————————+

519267222677684225 | { | “first_name”: “Lola”, | “friends”: 547, | “last_name”: “Dog”, | “location”: “NYC”, | “online”: true | } 519267222678110209 | { | “first_name”: “Ernie”, | “location”: “Brooklyn”, | “status”: “Looking for treats” | } |

示例3:从JSONB值中检索特定字段:使用->运算符来检索JSONB值特定字段。例如,从示例1中创建的表中检索字段:

SELECT name->’first_name’, name->’location’ FROM jsonbs;

?column? | ?column?

+—————+——————+

“Lola” | “NYC”

“Ernie” | “Brooklyn” |

示例4:使用 ->> 运算符将 JSONB 字段值作为STRING值返回:

SELECT name->>’first_name’, name->>’location’ FROM jsonbs;

?column? | ?column?

+—————+—————+

Lola | NYC Ernie |

Brooklyn (2 rows) |

示例5:使用JSONB列和计算列创建表

CREATE TABLE student_profiles ( id STRING PRIMARY KEY AS (profile->>’id’) STORED, profile JSONB );

CREATE TABLE

插入几行数据:

INSERT INTO student_profiles (profile) VALUES (‘{“id”: “d78236”, “name”: “Arthur Read”, “age”: “16”, “school”: “PVPHS”, “credits”: 120, “sports”: “none”}’), (‘{“name”: “Buster Bunny”, “age”: “15”, “id”: “f98112”, “school”: “THS”, “credits”: 67, “clubs”: “MUN”}’), (‘{“name”: “Ernie Narayan”, “school” : “Brooklyn Tech”, “id”: “t63512”, “sports”: “Track and Field”, “clubs”: “Chess”}’); INSERT 3

SELECT * FROM student_profiles;

id | profile

+————+——————————————————————————————————————————————————————————-+

d78236 | {“age”: “16”, “credits”: 120, “id”: “d78236”, “name”: “Arthur Read”, “school”: “PVPHS”, “sports”: “none”} f98112 | {“age”: “15”, “clubs”: “MUN”, “credits”: 67, “id”: “f98112”, “name”: “Buster Bunny”, “school”: “THS”}

t63512 | {“clubs”: “Chess”, “id”: “t63512”, “name”: “Ernie Narayan”, “school”: “Brooklyn Tech”, “sports”: “Track and Field”}

通过示例发现,主键 id被作为profile列中的字段计算。

ARRAY

​ ARRAY 数据类型是存储了非array类型的一维单索引的相同类型元素的数组。InCloud ZNBASE不支持嵌套数组,同时不支持在数组上创建数据库索引,以及不支持按数组排序。

语法

数据类型“ARRAY”的值可以通过以下方式表示:

  • 将方括号([])附加到任何非数组数据类型。

  • 将关键字ARRAY添加到任何非数组数据类型。

ARRAY值的大小是可变的,但建议将值保持在1MB以下以保证性能;高于该阈值,写入放大和其他因素可能导致显着的性能下降。

类型转换

数据类型支持转换时,可以在ARRAY值之间进行转换。例如,可以从BOOL数组转换为INT数组,但不能从BOOL数组转换为TIMESTAMP数组,举例如下:

SELECT ARRAY[true,false,true]::INT[];

array

+————-+

{1,0,1}

SELECT ARRAY[true,false,true]::TIMESTAMP[];

pq: invalid cast: bool[] -> TIMESTAMP[]

可以将数组强制转换为STRING值,举例如下:

SELECT ARRAY[1,NULL,3]::string;

array

+——————+

{1,NULL,3}

SELECT ARRAY[(1,’a b’),(2,’c”d’)]::string;

array

+—————————————————+

{“(1,\“a b\“)”,”(2,\“c\“\“d\“)”} (1 row) |

示例

示例1:通过加方括号创建数组列:

CREATE TABLE a (b STRING[]);

INSERT INTO a VALUES (ARRAY[‘sky’, ‘road’, ‘car’]);

SELECT * FROM a;

b

+————————+

{sky,road,car}

示例2:通过添加关键字ARRAY创建数组列:

CREATE TABLE c (d INT ARRAY);

INSERT INTO c VALUES (ARRAY[10,20,30]);

SELECT * FROM c;

d

+——————+

{10,20,30}

示例3:使用数组索引访问数组元素:

SELECT * FROM c;

d

+——————+

{10,20,30}

SELECT d[2] FROM c;

d

+——+

20

注意:InCloud ZNBASE中的数据是单索引的。

示例4:使用array_append函数,将元素追加到数组中:

SELECT * FROM c;

d

+——————+

{10,20,30}

UPDATE c SET d = array_append(d, 40) WHERE d[3] = 30;

SELECT * FROM c;

d

+———————-+

{10,20,30,40}

示例5:使用append(||)运算符:

SELECT * FROM c;

d

+———————-+

{10,20,30,40}

UPDATE c SET d = d || 50 WHERE d[4] = 40;

SELECT * FROM c;

d

+—————————+

{10,20,30,40,50} (1 row) |