JSONB

    别名

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

    语法

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

    有六种类型的JSONB值:

    • null

    • Boolean

    • String

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

    • 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的操作符:

    示例

    示例1:使用JSONB列创建表

    示例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” | } |

    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列和计算列创建表

    插入几行数据:

    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值的大小是可变的,但建议将值保持在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:通过加方括号创建数组列:

    示例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(||)运算符: