华为云用户手册

  • jsonb_to_record(object-json) 描述:正如所有返回record 的函数一样,调用者必须用一个AS子句显式地定义记录的结构。会将object-json的键值对进行拆分重组,把键当做列名,去匹配填充AS显示指定的记录的结构。 返回类型:record 示例: 1 2 3 4 5 SELECT * FROM jsonb_to_record('{"a":1,"b":"foo","c":"bar"}'::jsonb) as x(a int, b text, d text); a | b | d ---+-----+--- 1 | foo | (1 row)
  • jsonb_object(text[], text[]) 描述:两个文本数组的时候,第一个数组认为是键,第二个认为是值,两个数组长度必须相等。键不可为null。 返回类型:jsonb 示例: 1 2 3 4 5 SELECT jsonb_object('{a,b,"a b c"}', '{a,1,1}'); jsonb_object ------------------------------------ {"a": "a", "b": "1", "a b c": "1"} (1 row)
  • jsonb_build_array( [VARIADIC "any"] ) 描述:从一个可变参数列表构造一个可能包含异质类型的JSON数组。 返回类型:jsonb 示例: 1 2 3 4 5 SELECT jsonb_build_array('a',1,'b',1.2,'c',true,'d',null,'e',json '{"x": 3, "y": [1,2,3]}',''); jsonb_build_array ------------------------------------------------------------------------------- ["a", 1, "b", 1.2, "c", true, "d", null, "e", {"x": 3, "y": [1, 2, 3]}, null] (1 row)
  • jsonb_object(text[]) 描述:从一个文本数组构造一个object-jsonb。这是个重载函数,当入参为一个文本数组的时候,其数组长度必须为偶数,成员被当做交替出现的键/值对。 返回类型:jsonb 示例: 1 2 3 4 5 SELECT jsonb_object('{a,1,b,2,3,NULL,"d e f","a b c"}'); jsonb_object --------------------------------------------------- {"3": null, "a": "1", "b": "2", "d e f": "a b c"} (1 row)
  • jsonb_object_agg 描述:将键/值对聚集成一个JSON对象。 返回类型:jsonb 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 SELECT * FROM json_tbl_3; a | b | c ---+-----+---- 1 | aaa | 10 1 | bbb | 20 2 | ccc | 30 2 | ddd | 40 (4 rows) SELECT a, jsonb_object_agg(b, c) FROM json_tbl_3 GROUP BY a ORDER BY a; a | jsonb_object_agg ---+------------------------ 1 | {"aaa": 10, "bbb": 20} 2 | {"ccc": 30, "ddd": 40} (2 rows)
  • json_typeof(json) 描述:检测json类型。 返回类型:text 示例: 1 2 3 4 5 6 7 8 9 10 11 SELECT value, json_typeof(value) from (values (json '123.4'), (json '"foo"'), (json 'true'), (json 'null'), (json '[1, 2, 3]'), (json '{"x":"foo", "y":123}'), (NULL::json)) as data(value); value | json_typeof ----------------------+------------- 123.4 | number "foo" | string true | boolean null | null [1, 2, 3] | array {"x":"foo", "y":123} | object | (7 rows)
  • jsonb_agg 描述:将jsonb对象聚合成jsonb数组。 返回类型:jsonb 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 SELECT * FROM json_tbl_2; a | b ---+----- 1 | aaa 1 | bbb 2 | ccc 2 | ddd (4 rows) SELECT a, jsonb_agg(b) FROM json_tbl_2 GROUP BY a ORDER BY a; a | jsonb_agg ---+---------------- 1 | ["aaa", "bbb"] 2 | ["ccc", "ddd"] (2 rows)
  • json_object_keys(object-json) 描述:返回对象中顶层的所有键。 返回类型:text 示例: 1 2 3 4 5 6 7 SELECT json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}, "f1":"abcd"}'); json_object_keys ------------------ f1 f2 f1 (3 rows)
  • json_each(object-json) 描述:将对象的每个键值对拆分转换成一行两列。 返回类型:setof(key text, value json) 示例: 1 2 3 4 5 6 7 SELECT * FROM json_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null}'); key | value -----+---------- f1 | [1,2,3] f2 | {"f3":1} f4 | null (3 rows)
  • json_each_text(object-json) 描述:将对象的每个键值对拆分转换成一行两列。 返回类型:setof(key text, value text) 示例: 1 2 3 4 5 6 7 SELECT * FROM json_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null}'); key | value -----+---------- f1 | [1,2,3] f2 | {"f3":1} f4 | (3 rows)
  • json_populate_record(anyelement, object-json [, bool]) 描述:$1必须是一个复合类型的参数。将会把object-json里的每个对键值进行拆分,以键当做列名,与$1中的列名进行匹配查找,并填充到$1的格式中。 返回类型:anyelement 示例: 1 2 3 4 5 6 CREATE TYPE jpop AS (a text, b INT, c timestamp); SELECT * FROM json_populate_record(null::jpop,'{"a":"blurfl","x":43.2}'); a | b | c --------+---+--- blurfl | | (1 row)
  • json_to_record(object-json) 描述:正如所有返回record 的函数一样,调用者必须用一个AS子句显式地定义记录的结构。会将object-json的键值对进行拆分重组,把键当做列名,去匹配填充AS显示指定的记录的结构。 返回类型:record 示例: 1 2 3 4 5 SELECT * FROM json_to_record('{"a":1,"b":"foo","c":"bar"}'::json) as x(a int, b text, d text); a | b | d ---+-----+--- 1 | foo | (1 row)
  • json_to_recordset(array-json) 描述:参考函数json_to_record,对数组内个每个元素,执行上述函数的操作,因此这要求数组内的每个元素都得是object-json。 返回类型:setof record 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 SELECT * FROM json_to_recordset('[{"a":1,"b":{"d":"foo"},"c":true},{"a":2,"c":false,"b":{"d":"bar"}}]') AS x(a INT, b json, c BOOLEAN); a | b | c ---+-------------+--- 1 | {"d":"foo"} | t 2 | {"d":"bar"} | f (2 rows) SELECT * FROM json_to_recordset('[{"a":1,"b":"foo","d":false},{"a":2,"b":"bar","c":true}]') AS x(a INT, b text, c BOOLEAN); a | b | c ---+-----+--- 1 | foo | 2 | bar | t (2 rows)
  • json_populate_recordset(anyelement, array-json [, bool]) 描述:参考函数json_populate_record、jsonb_populate_record,对$2数组的每一个元素进行上述参数函数的操作,因此这也要求$2数组的每个元素都是object-json类型。 返回类型:setof anyelement 示例: 1 2 3 4 5 6 7 CREATE TYPE jpop AS (a text, b INT, c timestamp); SELECT * FROM json_populate_recordset(null::jpop, '[{"a":1,"b":2},{"a":3,"b":4}]'); a | b | c ---+---+--- 1 | 2 | 3 | 4 | (2 rows)
  • json_array_elements(array-json) 描述:拆分数组,每一个元素返回一行。 返回类型:json 示例: 1 2 3 4 5 6 7 8 SELECT json_array_elements('[1,true,[1,[2,3]],null]'); json_array_elements --------------------- 1 true [1,[2,3]] null (4 rows)
  • json_build_object(VARIADIC "any") 描述:从可变参数列表中构建JSON对象。参数列表由交替的键和值组成。其入参必须为偶数个,两两一组组成键值对。注意键不可为null。 返回类型:json 示例: 1 2 3 4 5 SELECT json_build_object('foo',1,'bar',2); json_build_object ------------------------ {"foo" : 1, "bar" : 2} (1 row)
  • to_json(anyelement) 描述:把参数转换为json。 返回类型:json 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 SELECT to_json('Fred said "Hi."'::text); to_json --------------------- "Fred said \"Hi.\"" (1 row) ——将列存表json_tbl_2转换为json postgres=# SELECT * FROM json_tbl_2; a | b ---+----- 1 | aaa 1 | bbb 2 | ccc 2 | ddd (4 rows) postgres=# SELECT to_json(t.*) FROM json_tbl_2 t; to_json ------------------- {"a":1,"b":"bbb"} {"a":2,"b":"ddd"} {"a":1,"b":"aaa"} {"a":2,"b":"ccc"} (4 rows)
  • json_strip_nulls(json) 描述:所有具有空值的对象字段被忽略,其他值保持不变。 返回类型:json 示例: 1 2 3 4 5 SELECT json_strip_nulls('[{"f1":1,"f2":null},2,null,3]'); json_strip_nulls --------------------- [{"f1":1},2,null,3] (1 row)
  • json_array_elements_text(array-json) 描述:拆分数组,每一个元素返回一行。 返回类型:text 示例: 1 2 3 4 5 6 7 8 SELECT * FROM json_array_elements_text('[1,true,[1,[2,3]],null]'); value ----------- 1 true [1,[2,3]] (4 rows)
  • json_object(text[])、json_object(text[], text[]) 描述:从文本数组中构建JSON对象。 这是个重载函数,当入参为一个文本数组的时候,其数组长度必须为偶数,成员被当做交替出现的键/值对。两个文本数组的时候,第一个数组被视为键,第二个被视为值,两个数组长度必须相等。键不可为null。 返回类型:json 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 SELECT json_object('{a, 1, b, "def", c, 3.5}'); json_object --------------------------------------- {"a" : "1", "b" : "def", "c" : "3.5"} (1 row) SELECT json_object('{{a, 1},{b, "def"},{c, 3.5}}'); json_object --------------------------------------- {"a" : "1", "b" : "def", "c" : "3.5"} (1 row) SELECT json_object('{a,b,"a b c"}', '{a,1,1}'); json_object --------------------------------------- {"a" : "a", "b" : "1", "a b c" : "1"} (1 row)
  • json_object_agg(any, any) 描述:将值聚集为json对象。 返回类型:json 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 SELECT * FROM classes; name | score -----+------- A | 2 A | 3 D | 5 D | (4 rows) SELECT json_object_agg(name, score) FROM classes group by name order by name; json_object_agg ------------------------- { "A" : 2, "A" : 3 } { "D" : 5, "D" : null } (2 rows)
  • json_agg(any) 描述:将值聚集为json数组。 返回类型:array-json 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 SELECT * FROM classes; name | score -----+------- A | 2 A | 3 D | 5 D | (4 rows) SELECT name, json_agg(score) score FROM classes group by name order by name; name | score -----+----------------- A | [2, 3] D | [5, null] | [null] (3 rows)
  • array_to_json(anyarray [, pretty_bool]) 描述:返回JSON类型的数组。一个多维数组成为一个JSON数组的数组。如果pretty_bool为设置为true,将在一维元素之间添加换行符。 返回类型:json 示例: 1 2 3 4 5 SELECT array_to_json('{{1,5},{99,100}}'::int[]); array_to_json ------------------ [[1,5],[99,100]] (1 row)
  • row_to_json(record [, pretty_bool]) 描述:返回JSON类型的行。如果pretty_bool设置为true,将在第一级元素之间添加换行符。 返回类型:json 示例: 1 2 3 4 5 SELECT row_to_json(row(1,'foo')); row_to_json --------------------- {"f1":1,"f2":"foo"} (1 row)
  • 参数说明 OR REPLACE 如果视图已存在,则重新定义。 TEMP | TEMPORARY 创建临时视图。 view_name 要创建的视图名称。可以用模式修饰。 取值范围:字符串,符合标识符命名规范。 column_name 可选的名字列表,用作视图的字段名。如果没有给出,字段名取自查询中的字段名。 取值范围:字符串,符合标识符命名规范。 view_option_name [= view_option_value] 该子句为视图指定一个可选的参数。 目前view_option_name支持的参数仅有security_barrier,当VIEW试图提供行级安全时,应使用该参数。 取值范围:boolean类型,TRUE、FALSE query 为视图提供行和列的SELECT或VALUES语句。 视图解耦功能下不支持CTE重名。例如: 1 2 3 CREATE TABLE t1(a1 INT, b1 INT); CREATE TABLE t2(a2 INT, b2 INT, c2 INT); CREATE OR REPLACE VIEW v1 AS WITH tmp AS (SELECT * FROM t2) ,tmp1 AS (SELECT b2,c2 FROM tmp WHERE b2 = (WITH RECURSIVE tmp(aa, bb) AS (SELECT a1,b1 FROM t1) SELECT bb FROM tmp WHERE aa = c2)) SELECT c2 FROM tmp1;
  • 语法格式 1 2 3 CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW view_name [ ( column_name [, ...] ) ] [ WITH ( {view_option_name [= view_option_value]} [, ... ] ) ] AS query; 创建视图时使用WITH(security_barriers)可以创建一个相对安全的视图,避免攻击者利用低成本函数的RAISE语句打印出隐藏的基表数据。 GUC参数view_independent打开时,支持普通视图删除列。需注意,如果存在列级约束,不支持该列的删除。
  • 可更新的视图 当开启视图可更新参数(enable_view_update)后,系统允许对简单视图使用INSERT,UPDATE、DELETE和MERGE INTO语句进行更新。(MERGE INTO语句更新仅8.1.2及以上版本支持) 满足以下所有条件的视图可进行更新: 视图定义的FROM语句中只能有一个普通表,不能是系统表、外表、delta表、toast表、错误表。 视图中包含可更新的列,这些列是对基础表可更新列的简单引用。 视图定义不能包含WITH、DISTINCT、GROUP BY、ORDER BY、FOR UPDATE、FOR SHARE、HAVING、TABLESAMPLE、LIMIT、OFFSET子句。 视图定义不能包含UNION、INTERSECT、EXCEPT集合操作。 视图定义的选择列表不能包含聚集函数、窗口函数、返回集合的函数。 对于INSERT、UPDATE和DELETE语句,视图上不能有触发时机为INSTEAD OF的触发器。对于MERGE INTO语句,视图和基础表上都不能有触发器。 视图定义不能包含子链接。 视图定义不能包含属性为VOLATILE的函数(函数值可以在一次表扫描内改变的函数) 视图定义不能对表的分布键所在列起别名,或将普通列起别名为分布键列名。 视图更新操作中包含RETURNING子句时,视图定义中的列只能来自于基础表。 如果可更新的视图定义包含WHERE条件,则该条件将会限制UPDATE和DELETE语句修改基础表上的行。如果UPDATE语句更改行后不再满足WHERE条件,更新后通过视图将无法查询到。类似地如果INSERT命令插入了不满足WHERE条件的数据,插入后通过视图将无法查询到。在视图上执行插入、更新或删除的用户必须在视图和表上具有相应的插入、更新或删除权限。
  • 注意事项 LOCK TABLE只能在一个事务块的内部有用,因为锁在事务结束时就会被释放。出现在任意事务块外面的LOCK TABLE都会报错。 如果没有声明锁模式,缺省为最严格的模式AC CES S EXCLUSIVE。 LOCK TABLE ... IN ACCESS SHARE MODE需要在目标表上有SELECT权限。所有其他形式的LOCK需要UPDATE和/或DELETE权限。 没有UNLOCK TABLE命令,锁总是在事务结束时释放。 LOCK TABLE只处理表级的锁,因此那些带“ROW”字样的锁模式都是有歧义的。这些模式名字通常可理解为用户试图在一个被锁定的表中获取行级的锁。同样,ROW EXCLUSIVE模式也是一个可共享的表级锁。注意,只要是涉及到LOCK TABLE ,所有锁模式都有相同的语意,区别仅在于规则中锁与锁之间是否冲突,规则请参见表1。
  • 功能描述 LOCK TABLE获取表级锁。 当自动获取引用表的命令的锁时, GaussDB (DWS)会始终使用限制最小的锁模式。如果用户需要一种更为严格的锁模式,可以使用LOCK命令。例如,某个应用是在Read Committed隔离级别上运行事务,并且需要保证表中的数据在事务运行期间保持稳定。为实现这个目的,则可以在查询之前对表使用SHARE锁模式进行锁定。这样将防止并发数据更改,并确保后续的查询可以读到已提交的持久化的数据。因为SHARE锁模式与任何写操作需要的ROW EXCLUSIVE模式冲突,并且LOCK TABLE name IN SHARE MODE语句将等到所有当前持有ROW EXCLUSIVE模式锁的事务提交或回滚后才能执行。因此,一旦获得该锁,就不会存在未提交的写操作,此外其他操作也只能等到该锁释放之后才能开始。
  • 参数说明 表1 冲突的锁模式 请求的锁模式/当前锁模式 ACCESS SHARE ROW SHARE ROW EXCLUSIVE SHARE UPDATE EXCLUSIVE SHARE SHARE ROW EXCLUSIVE EXCLUSIVE ACCESS EXCLUSIVE ACCESS SHARE - - - - - - - X ROW SHARE - - - - - - X X ROW EXCLUSIVE - - - - X X X X SHARE UPDATE EXCLUSIVE - - - X X X X X SHARE - - X X - X X X SHARE ROW EXCLUSIVE - - X X X X X X EXCLUSIVE - X X X X X X X ACCESS EXCLUSIVE X X X X X X X X LOCK的参数说明如下所示: name 要锁定的表的名字,可以有模式修饰。 LOCK TABLE命令中声明的表的顺序就是上锁的顺序。 取值范围:已存在的表名。 ONLY 如果指定ONLY只有该表被锁定,如果没有声明该表和他的所有子表将都被锁定。 ACCESS SHARE ACCESS锁只允许对表进行读取,而禁止对表进行修改。所有对表进行读取而不修改的SQL语句都会自动请求这种锁。例如,SELECT命令会自动在被引用的表上请求一个这种锁。 ROW SHARE ROW SHARE锁允许对表进行并发读取,禁止对表进行其他操作。 SELECT FOR UPDATE和SELECT FOR SHARE命令会自动在目标表上请求ROW SHARE锁(且所有被引用但不是FOR SHARE/FOR UPDATE的其他表上,还会自动加上ACCESS SHARE锁)。 ROW EXCLUSIVE 与ROW SHARE锁不同,ROW EXCLUSIVE允许并发读取表,也允许修改表中的数据。UPDATE,DELETE,INSERT命令会自动在目标表上请求这个锁(且所有被引用的其他表上还会自动加上的ACCESS SHARE锁)。通常情况下,所有会修改表数据的命令都会请求表的ROW EXCLUSIVE锁。 SHARE UPDATE EXCLUSIVE 这个模式保护一个表的模式不被并发修改,以及禁止在目标表上执行垃圾回收命令(VACUUM )。 VACUUM(不带FULL选项),ANALYZE,CREATE INDEX CONCURRENTLY命令会自动请求这样的锁。 SHARE SHARE锁允许并发的查询,但是禁止对表进行修改。 CREATE INDEX(不带CONCURRENTLY选项)语句会自动请求这种锁。 SHARE ROW EXCLUSIVE SHARE ROW EXCLUSIVE锁禁止对表进行任何的并发修改,而且是独占锁,因此一个会话中只能获取一次。 任何SQL语句都不会自动请求这个锁模式。 EXCLUSIVE EXCLUSIVE锁允许对目标表进行并发查询,但是禁止任何其他操作。 这个模式只允许并发加ACCESS SHARE锁,也就是说,只有对表的读动作可以和持有这个锁模式的事务并发执行。 任何SQL语句都不会在用户表上自动请求这个锁模式。然而在某些操作的时候,会在某些系统表上请求它。 ACCESS EXCLUSIVE 这个模式保证其所有者(事务)是可以访问该表的唯一事务。 ALTER TABLE,DROP TABLE,TRUNCATE,REINDEX,CLUSTER,VACUUM FULL命令会自动请求这种锁。 在LOCK TABLE命令没有明确声明需要的锁模式时,它是缺省锁模式。 NOWAIT 声明LOCK TABLE不去等待任何冲突的锁释放,如果无法立即获取该锁,该命令退出并且发出一个错误信息。 在不指定NOWAIT的情况下获取表级锁时,如果有其他互斥锁存在的话,则等待其他锁的释放。 LOCAL COORDINATOR ONLY 声明LOCK TABLE只在接收当前会话请求的CN上执行,而不会下发给其他CN和所有DN。该选项仅针对元数据的操作,以提高效率。 该参数仅8.2.0.100以上集群版本支持。 当前仅支持ACCESS SHARE锁模式,其他锁模式会报错。
共100000条