派生型
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) |