华为云用户手册

  • 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_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_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)
  • 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_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_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_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_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)
  • 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_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)
  • 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)
  • 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)
  • 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)
  • 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)
  • 可更新的视图 当开启视图可更新参数(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条件的数据,插入后通过视图将无法查询到。在视图上执行插入、更新或删除的用户必须在视图和表上具有相应的插入、更新或删除权限。
  • 常量与宏 GaussDB(DWS)支持的常量和宏请参见表1。 表1 常量和宏 参数 描述 相关SQL语句示例 CURRENT_CATALOG 当前数据库 1 SELECT CURRENT_CATALOG; CURRENT_ROLE 当前角色 1 SELECT CURRENT_ROLE; CURRENT_SCHEMA 当前数据库模式 1 SELECT CURRENT_SCHEMA; CURRENT_USER 当前用户 1 SELECT CURRENT_USER; LOCALTIMESTAMP 当前会话时间(无时区) 1 SELECT LOCALTIMESTAMP; NULL 空值 - SESSION_USER 当前系统用户 1 SELECT SESSION_USER; SYSDATE 当前系统日期 1 SELECT SYSDATE; USER 当前用户,与CURRENT_USER 一致。 1 SELECT USER;
  • 示例 以默认方式启动事务: 1 2 3 START TRANSACTION; SELECT * FROM tpcds.reason; END; 以隔离级别为READ COMMITTED,读/写方式启动事务: 1 2 3 START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE; SELECT * FROM tpcds.reason; COMMIT;
  • 参数说明 WORK | TRANSACTION BEGIN格式中的可选关键字,没有实际作用。 ISOLATION LEVEL 指定事务隔离级别,它决定当一个事务中存在其他并发运行事务时它能够看到什么数据。 在事务中第一个数据修改语句(INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。 取值范围: READ COMMITTED:读已提交隔离级别,只能读到已经提交的数据,而不会读到未提交的数据。这是缺省值。 READ UNCOMMITTED:读未提交隔离级别,GaussDB(DWS)不支持READ UNCOMMITTED,如果设置了READ UNCOMMITTED,实际上使用的是READ COMMITTED。 REPEATABLE READ: 可重复读隔离级别,仅仅看到事务开始之前提交的数据,它不能看到未提交的数据,以及在事务执行期间由其它并发事务提交的修改。 SERIALIZABLE:事务可序列化,GaussDB(DWS)不支持SERIALIZABLE,如果设置了SERIALIZABLE,实际上使用的是REPEATABLE READ。 READ WRITE | READ ONLY 指定事务访问模式(读/写或者只读)。
  • 语法格式 格式一:START TRANSACTION格式 1 2 3 4 5 6 7 START TRANSACTION [ { ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ } | { READ WRITE | READ ONLY } } [, ...] ]; 格式二:BEGIN格式 1 2 3 4 5 6 7 BEGIN [ WORK | TRANSACTION ] [ { ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ } | { READ WRITE | READ ONLY } } [, ...] ];
  • create_wdr_snapshot() 描述:创建性能数据快照。 返回值类型:text 该函数只有数据库管理员SYSADMIN才可以执行,非管理员执行会提示无权限。 该函数只能在CN上执行,在DN上执行会返回:“WDR snapshot can only be created on coordinator.”。 执行该函数前需确认enable_wdr_snapshot参数处于开启状态。如果enable_wdr_snapshot为off,执行该函数会返回:“WDR snapshot request can't be executed, because GUC parameter 'enable_wdr_snapshot' is off.”。 如果执行该函数时,快照线程由于节点重启等原因尚未启动,会提示错误:“WDR snapshot request can not be accepted, please retry later.”。 如果执行该函数失败,会提示:“Cannot respond to WDR snapshot request.”。 如果执行成功,会返回:“WDR snapshot request has been submitted.”。该提示表明创建快照请求已发送至后台快照线程,但不代表创建快照成功。
  • pg_export_snapshot() 描述:保存当前的快照并返回它的标识符。 返回值类型:text 备注:函数pg_export_snapshot保存当前的快照并返回一个文本字符串标识此快照。这个字符串必须传递给想要导入快照的客户端。可用在set transaction snapshot snapshot_id时导入snapshot,但是应用的前提是该事务设置了REPEATABLE READ隔离级别。该函数的输出不可用做set transaction snapshot的输入。 示例: 1 2 3 4 5 SELECT pg_export_snapshot(); pg_export_snapshot -------------------- 00000000000A7128-1 (1 row)
  • kill_snapshot(scope cstring) 描述:中止后台快照线程。该函数向后台快照线程发送中止信号并等待线程结束。 输入参数scope:表示操作范围。该参数取值范围为local和global。 local表示中止当前CN上的快照线程。 global表示不仅会中止当前CN上的快照线程,还会向集群中所有其他CN发送中止快照线程的请求,即中止集群中所有CN上的快照线程。 如果输入其他值,则报错“Scope is invalid, use "local" or "global".”。 输入参数可为空,表示默认取值为local。 返回值类型:无 该函数只有数据库管理员SYSADMIN才有权执行,非管理员执行会提示无权限。 该函数只能在CN上执行,在DN上执行会提示:“kill_snapshot can only be executed on coordinator.”; 执行该函数会向后台快照线程发送中止信号并等待其结束。如果100s内快照线程仍未中止则会报错:“Kill snapshot thread failed”;
  • 停用词 停用词是很常见的词,几乎出现在每一个文档中,并且没有区分值。因此,在全文搜索的语境下可忽视它们。停用词处理逻辑和词典类型相关。其中,Ispell词典会先对标记进行规范化,然后再查看停用词表,而Snowball词典会最先检查输入标记是否为停用词。 例如,每个英文文本包含像a和the的单词,因此没必要将它们存储在索引中。然而,停用词影响tsvector中的位置,同时位置也会影响相关度: 1 2 3 4 SELECT to_tsvector('english','in the list of stop words'); to_tsvector ---------------------------- 'list':3 'stop':5 'word':6 位置1、2、4是停用词,所以不显示。为包含和不包含停用词的文档计算出的排序是完全不同的: 1 2 3 4 5 6 7 8 9 SELECT ts_rank_cd (to_tsvector('english','in the list of stop words'), to_tsquery('list & stop')); ts_rank_cd ------------ .05 SELECT ts_rank_cd (to_tsvector('english','list stop words'), to_tsquery('list & stop')); ts_rank_cd ------------ .1 父主题: 词典
  • 注意事项 不允许对一个已关闭的游标再做任何操作。 一个不再使用的游标应该尽早关闭。 当创建游标的事务用COMMIT或ROLLBACK终止之后,每个不可保持的已打开游标都隐含关闭。 当创建游标的事务通过ROLLBACK退出之后,每个可以保持的游标都将隐含关闭。 当创建游标的事务成功提交,可保持的游标将保持打开,直到执行一个明确的CLOSE或者客户端断开。 GaussDB(DWS)没有明确打开游标的OPEN语句,因为一个游标在使用CURSOR命令定义的时候就打开了。可以通过查询系统视图pg_cursors看到所有可用的游标。
  • 参数说明 IF EXISTS 如果指定的触发器不存在,则发出一个notice而不是抛出一个错误。 trigger_name 要删除的触发器名字。 取值范围:已存在的触发器。 table_name 要删除的触发器所在的表名称。 取值范围:已存在的含触发器的表。 CASCADE | RESTRICT CASCADE:级联删除依赖此触发器的对象。 RESTRICT:如果有依赖对象存在,则拒绝删除此触发器。此选项为缺省值。
  • 操作步骤 获取词典定义文件和词缀文件。 用户可以使用开源词典,直接获取的开源词典后缀名可能为.aff和.dic,此时需要将扩展名改为.affix和.dict。此外,对于某些词典文件,还需要使用下面的命令把字符转换成UTF-8编码,比如挪威语词典: 1 2 iconv -f ISO_8859-1 -t UTF-8 -o nn_no.affix nn_NO.aff iconv -f ISO_8859-1 -t UTF-8 -o nn_no.dict nn_NO.dic 创建Ispell词典。 1 2 3 4 5 6 CREATE TEXT SEARCH DICTIONARY norwegian_ispell ( TEMPLATE = ispell, DictFile = nn_no, AffFile = nn_no, FilePath = 'obs://bucket01/obs.xxx.xxx.com accesskey=xxxxx secretkey=xxxxx region=cn-north-1' ); 其中,词典文件全名为nn_no.dict和nn_no.affix,所在目录为 'obs://bucket01/obs.xxx.xxx.com accesskey=xxxxx secretkey=xxxxx region=cn-north-1'。关于创建词典的语法和更多参数,请参见CREATE TEXT SEARCH DICTIONARY。 使用Ispell词典进行复合词拆分。 1 2 3 4 5 SELECT ts_lexize('norwegian_ispell', 'sjokoladefabrikk'); ts_lexize --------------------- {sjokolade,fabrikk} (1 row) MySpell不支持复合词,Hunspell对复合词有较好的支持。GaussDB(DWS)仅支持Hunspell中基本的复合词操作。通常情况下,Ispell词典能够识别的词是一个有限集合,其后应该配置一个更广义的词典,例如一个可以识别所有词的Snowball词典。
  • 示例 撤销 my_savepoint 建立之后执行的命令的影响: 1 ROLLBACK TO SAVEPOINT my_savepoint; 游标位置不受保存点回滚的影响: 1 2 3 4 5 6 7 8 9 10 11 12 13 BEGIN; DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2; SAVEPOINT foo; FETCH 1 FROM foo; ?column? ---------- 1 ROLLBACK TO SAVEPOINT foo; FETCH 1 FROM foo; ?column? ---------- 2 COMMIT;
  • 注意事项 不能回滚到未定义的保存点,语法上会报错。 在保存点方面,游标有一些非事务性的行为。任何在保存点里打开的游标都会在回滚掉这个保存点之后关闭。如果一个前面打开了的游标在保存点里面,并且游标被一个FETCH命令影响,而这个保存点稍后回滚了,那么这个游标的位置仍然在FETCH让它指向的位置(也就是FETCH不会被回滚)。关闭一个游标的行为也不会被回滚给撤销掉。如果一个游标的操作导致事务回滚,那么这个游标就会置于不可执行状态,所以,尽管一个事务可以用ROLLBACK TO SAVEPOINT重新恢复,但是游标不能再使用了。 使用ROLLBACK TO SAVEPOINT回滚到保存点。使用RELEASE SAVEPOINT删除保存点,但是保留该保存点建立后执行的命令的效果。
  • 模式可见性查询函数 每个函数对数据库对象执行可见性检查。对于函数和操作符,如果在前面的搜索路径中没有相同的对象名称和参数的数据类型,则此对象是可见的。对于操作符类,则要同时考虑名字和相关索引的访问方法。 所有这些函数都需要使用OID来标识要需要检查的对象。如果用户想通过名字测试对象,则可使用OID别名类型(regclass、regtype、regprocedure、regoperator、regconfig或regdictionary)。 比如,如果一个表所在的模式在搜索路径中,并且在前面的搜索路径中没有同名的表,那么这个表是可见的。它等效于表可以不带明确模式修饰进行引用。比如,要列出所有可见表的名字: 1 SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
共100000条