华为云用户手册

  • date_part date_part函数是在传统的Ingres函数的基础上制作的(该函数等效于SQL标准函数extract): date_part('field', source) 这里的field参数必须是一个字符串,而不是一个名称。有效的field与extract一样,详细信息请参见EXTRACT。 示例: 12345 gaussdb=# SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 16(1 row) 12345 gaussdb=# SELECT date_part('hour', INTERVAL '4 hours 3 minutes'); date_part ----------- 4(1 row)
  • TIMESTAMPDIFF TIMESTAMPDIFF(unit , timestamp_expr1, timestamp_expr2) timestampdiff函数是计算两个日期时间之间(timestamp_expr2-timestamp_expr1)的差值,并以unit形式返回结果。timestamp_expr1,timestamp_expr2必须是一个timestamp、timestamptz、date类型的值表达式。unit表示的是两个日期差的单位。 等效于timestamp_diff(text, timestamp, timestamp)。 该函数仅在 GaussDB Kernel兼容MY类型时(即dbcompatibility = 'B')有效,其他类型不支持该函数。 year 年份。 12345 gaussdb=# SELECT TIMESTAMPDIFF(YEAR, '2018-01-01', '2020-01-01'); timestamp_diff---------------- 2(1 row)
  • EXTRACT EXTRACT(field FROM source) extract函数从日期或时间的数值里抽取子域,比如年、小时等。source必须是一个timestamp、time或interval类型的值表达式(类型为date的表达式转换为timestamp,因此也可以用)。field是一个标识符或者字符串,它指定从源数据中抽取的域。extract函数返回类型为double precision的数值。field的取值范围如下所示。 century 世纪。 第一个世纪从0001-01-01 00:00:00 AD开始。这个定义适用于所有使用阳历的国家。没有0世纪,直接从公元前1世纪到公元1世纪。 示例: 12345 gaussdb=# SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); date_part ----------- 20(1 row) day 如果source为timestamp,表示月份里的日期(1-31)。 12345 gaussdb=# SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 16(1 row) 如果source为interval,表示天数。 12345 gaussdb=# SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute'); date_part ----------- 40(1 row) decade 年份除以10。 12345 gaussdb=# SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 200(1 row) dow 每周的星期几,星期天(0)到星期六(6)。 12345 gaussdb=# SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 5(1 row) doy 一年的第几天(1~365/366)。 12345 gaussdb=# SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 47(1 row) epoch 如果source为timestamp with time zone,表示自1970-01-01 00:00:00-00 UTC以来的秒数(结果可能是负数); 如果source为date和timestamp,表示自1970-01-01 00:00:00-00当地时间以来的秒数; 如果source为interval,表示时间间隔的总秒数。 12345 gaussdb=# SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08'); date_part -------------- 982384720.12(1 row) 12345 gaussdb=# SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); date_part ----------- 442800(1 row) 将epoch值转换为时间戳的方法。 12345 gaussdb=# SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720.12 * INTERVAL '1 second' AS RESULT; result --------------------------- 2001-02-17 12:38:40.12+08(1 row) hour 小时域(0-23)。 12345 gaussdb=# SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 20(1 row) isodow 一周的第几天(1-7)。 星期一为1,星期天为7。 除了星期天外,都与dow相同。 12345 gaussdb=# SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40'); date_part ----------- 7(1 row) isoyear 日期中的ISO 8601标准年(不适用于间隔)。 每个带有星期一开始的周中包含1月4日的ISO年,所以在年初的1月或12月下旬的ISO年可能会不同于阳历的年。详细信息请参见后续的week描述。 12345 gaussdb=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01'); date_part ----------- 2005(1 row) 12345 gaussdb=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); date_part ----------- 2006(1 row) microseconds 秒域(包括小数部分)乘以1,000,000。 12345 gaussdb=# SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5'); date_part ----------- 28500000(1 row) millennium 千年。 20世纪(19xx年)里面的年份在第二个千年里。第三个千年从2001年1月1日零时开始。 12345 gaussdb=# SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 3(1 row) milliseconds 秒域(包括小数部分)乘以1000。请注意它包括完整的秒。 12345 gaussdb=# SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5'); date_part ----------- 28500(1 row) minute 分钟域(0-59)。 12345 gaussdb=# SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 38(1 row) month 如果source为timestamp,表示一年里的月份数(1-12)。 12345 gaussdb=# SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 2(1 row) 如果source为interval,表示月的数目,然后对12取模(0-11)。 12345 gaussdb=# SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months'); date_part ----------- 1(1 row) quarter 该天所在的该年的季度(1-4)。 12345 gaussdb=# SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 1(1 row) second 秒域,包括小数部分(0-59)。 12345 gaussdb=# SELECT EXTRACT(SECOND FROM TIME '17:12:28.5'); date_part ----------- 28.5(1 row) timezone 与UTC的时区偏移量,单位为秒。正数对应UTC东边的时区,负数对应UTC西边的时区。 timezone_hour 时区偏移量的小时部分。 timezone_minute 时区偏移量的分钟部分。 week 该天在所在的年份里是第几周。ISO 8601定义一年的第一周包含该年的一月四日(ISO-8601 的周从星期一开始)。换句话说,一年的第一个星期四在第一周。 在ISO定义里,一月的头几天可能是前一年的第52或者第53周,十二月的后几天可能是下一年第一周。比如,2005-01-01是2004年的第53周,而2006-01-01是2005年的第52周,2012-12-31是2013年的第一周。建议isoyear字段和week一起使用以得到一致的结果。 12345 gaussdb=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 7(1 row) year 年份域。 12345 gaussdb=# SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 2001(1 row)
  • 时间/日期函数 age(timestamp, timestamp) 描述:将两个参数相减,并以年、月、日作为返回值。若相减值为负,则函数返回亦为负,入参可以都带timezone或都不带timezone。 返回值类型:interval 示例: 12345 gaussdb=# SELECT age(timestamp '2001-04-10', timestamp '1957-06-13'); age ------------------------- 43 years 9 mons 27 days(1 row) age(timestamp) 描述:当前时间和参数相减,入参可以带或者不带timezone。 返回值类型:interval 示例: 12345 gaussdb=# SELECT age(timestamp '1957-06-13'); age ------------------------- 60 years 2 mons 18 days(1 row) clock_timestamp() 描述:实时时钟的当前时间戳。 返回值类型:timestamp with time zone 示例: 12345 gaussdb=# SELECT clock_timestamp(); clock_timestamp ------------------------------- 2017-09-01 16:57:36.636205+08(1 row) current_date 描述:当前日期。 返回值类型:date 示例: 12345 gaussdb=# SELECT current_date; date ------------ 2017-09-01(1 row) 此函数在参数a_format_version值为10c和a_format_dev_version值为s2的情况下返回值类型为timestamp。 current_time 描述:当前时间。 返回值类型:time with time zone 示例: 12345 gaussdb=# SELECT current_time; timetz -------------------- 16:58:07.086215+08(1 row) current_timestamp 描述:当前日期及时间。 返回值类型:timestamp with time zone 示例: 12345 gaussdb=# SELECT current_timestamp; pg_systimestamp ------------------------------ 2017-09-01 16:58:19.22173+08(1 row) current_timestamp(precision) 描述:当前日期及时间,并将结果的微秒圆整为指定小数位。 返回值类型:timestamp with time zone 示例: 12345 gaussdb=# SELECT current_timestamp(1); timestamptz ------------------------------ 2017-09-01 16:58:19.2+08(1 row) 此函数在参数a_format_version值为10c和a_format_dev_version值为s2的情况下,precision参数支持numeric类型的整值,否则仅支持int输入。 微秒末位的0不显示。如 2017-09-01 10:32:19.212000 输出显示为 2017-09-01 10:32:19.212。 date_part(text, timestamp) 描述:获取日期/时间值中子域的值,例如年或者小时的值。等效于extract(field from timestamp)。 timestamp类型:abstime、date、interval、reltime、time with time zone、time without time zone、timestamp with time zone、timestamp without time zone。 返回值类型:double precision 示例: 12345 gaussdb=# SELECT date_part('hour', timestamp '2001-02-16 20:38:40'); date_part ----------- 20(1 row) date_part(text, interval) 描述:获取日期/时间值中子域的值。获取月份值时,如果月份值大于12,则取与12的模。等效于extract(field from timestamp)。 返回值类型:double precision 示例: 12345 gaussdb=# SELECT date_part('month', interval '2 years 3 months'); date_part ----------- 3(1 row) timestamp_diff(text, timestamp, timestamp) 描述:计算两个日期时间之间的差值,截取到参数text指定的精度。 返回值类型:int64 示例: 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445 gaussdb=# SELECT timestamp_diff('year','2018-01-01','2020-04-01'); timestamp_diff ---------------- 2(1 row)gaussdb=# SELECT timestamp_diff('month','2018-01-01','2020-04-01'); timestamp_diff ---------------- 27(1 row)gaussdb=# SELECT timestamp_diff('quarter','2018-01-01','2020-04-01'); timestamp_diff ---------------- 9(1 row)gaussdb=# SELECT timestamp_diff('week','2018-01-01','2020-04-01'); timestamp_diff ---------------- 117(1 row)gaussdb=# SELECT timestamp_diff('day','2018-01-01','2020-04-01'); timestamp_diff ---------------- 821(1 row)gaussdb=# SELECT timestamp_diff('hour','2018-01-01 10:10:10','2018-01-01 12:12:12'); timestamp_diff ---------------- 2(1 row)gaussdb=# SELECT timestamp_diff('minute','2018-01-01 10:10:10','2018-01-01 12:12:12'); timestamp_diff ---------------- 122(1 row)gaussdb=# SELECT timestamp_diff('second','2018-01-01 10:10:10','2018-01-01 10:12:12'); timestamp_diff ---------------- 122(1 row)gaussdb=# SELECT timestamp_diff('microsecond','2018-01-01 10:10:10','2018-01-01 10:12:12'); timestamp_diff ---------------- 122000000(1 row) date_trunc(text, timestamp) 描述:截取到参数text指定的精度。 返回值类型:interval、timestamp with time zone、timestamp without time zone 示例: 12345 gaussdb=# SELECT date_trunc('hour', timestamp '2001-02-16 20:38:40'); date_trunc --------------------- 2001-02-16 20:00:00(1 row) trunc(timestamp) 描述:默认按天截取。 示例: 1234 gaussdb=# SELECT trunc(timestamp '2001-02-16 20:38:40'); trunc---------------------2001-02-16 00:00:00(1 row) trunc(arg1, arg2) 描述:截取到arg2指定的精度。 arg1类型:interval、timestamp with time zone、timestamp without time zone arg2类型:text 返回值类型:interval、timestamp with time zone、timestamp without time zone 示例: 1234 gaussdb=# SELECT trunc(timestamp '2001-02-16 20:38:40', 'hour'); trunc---------------------2001-02-16 20:00:00(1 row) round(arg1, arg2) 描述:四舍五入到arg2指定的精度。 arg1类型:timestamp without time zone arg2类型:text 返回值类型:timestamp without time zone 示例: 1234 gaussdb=# SELECT round(timestamp '2001-02-16 20:38:40', 'hour'); round---------------------2001-02-16 21:00:00(1 row) 此函数在参数a_format_version值为10c和a_format_dev_version值为s1的情况下有效。 daterange(arg1, arg2) 描述:获取时间边界信息。arg1和arg2的类型为date。 返回值类型:daterange 示例: 12345 gaussdb=# select daterange('2000-05-06','2000-08-08'); daterange ------------------------- [2000-05-06,2000-08-08)(1 row) daterange(arg1, arg2, text) 描述:获取时间边界信息。arg1和arg2的类型为date,text类型为text。 返回值类型:daterange 示例: 12345 gaussdb=# select daterange('2000-05-06','2000-08-08','[]'); daterange ------------------------- [2000-05-06,2000-08-09)(1 row) extract(field from timestamp) 描述:获取小时的值。 返回值类型:double precision 示例: 12345 gaussdb=# SELECT extract(hour from timestamp '2001-02-16 20:38:40'); date_part ----------- 20(1 row) extract(field from interval) 描述:获取月份的值。如果大于12,则取与12的模。 返回值类型:double precision 示例: 12345 gaussdb=# SELECT extract(month from interval '2 years 3 months'); date_part ----------- 3(1 row) isfinite(date) 描述:测试是否为有效日期。 返回值类型:Boolean 示例: 12345 gaussdb=# SELECT isfinite(date '2001-02-16'); isfinite ---------- t(1 row) isfinite(timestamp) 描述:测试判断是否为有效时间。 返回值类型:Boolean 示例: 12345 gaussdb=# SELECT isfinite(timestamp '2001-02-16 21:28:30'); isfinite ---------- t(1 row) isfinite(interval) 描述:测试是否为有效区间。 返回值类型:Boolean 示例: 12345 gaussdb=# SELECT isfinite(interval '4 hours'); isfinite ---------- t(1 row) justify_days(interval) 描述:将时间间隔以月(30天为一月)为单位。 返回值类型:interval 示例: 12345 gaussdb=# SELECT justify_days(interval '35 days'); justify_days -------------- 1 mon 5 days(1 row) justify_hours(interval) 描述:将时间间隔以天(24小时为一天)为单位。 返回值类型:interval 示例: 12345 gaussdb=# SELECT JUSTIFY_HOURS(INTERVAL '27 HOURS'); justify_hours ---------------- 1 day 03:00:00(1 row) justify_interval(interval) 描述:结合justify_days和justify_hours,调整interval。 返回值类型:interval 示例: 12345 gaussdb=# SELECT JUSTIFY_INTERVAL(INTERVAL '1 MON -1 HOUR'); justify_interval ------------------ 29 days 23:00:00(1 row) localtime 描述:当前时间。 返回值类型:time 示例: 12345 gaussdb=# SELECT localtime AS RESULT; result---------------- 16:05:55.664681(1 row) localtimestamp 描述:当前日期及时间。 返回值类型:timestamp 示例: 12345 gaussdb=# SELECT localtimestamp; timestamp ---------------------------- 2017-09-01 17:03:30.781902(1 row) now() 描述:当前日期及时间。 返回值类型:timestamp with time zone 示例: 12345 gaussdb=# SELECT now(); now ------------------------------- 2017-09-01 17:03:42.549426+08(1 row) timenow() 描述:当前日期及时间。 返回值类型:abstime 示例: 12345 gaussdb=# select timenow(); timenow------------------------ 2020-06-23 20:36:56+08(1 row) dbtimezone 描述:当前数据库的时区。 返回值类型:text 示例: 12345 gaussdb=# select dbtimezone; dbtimezone------------------------ PRC(1 row) 此函数在参数a_format_version值为10c和a_format_dev_version值为s2的情况下有效。 numtodsinterval(num, interval_unit) 描述:将数字转换为interval类型。num为numeric类型数字,interval_unit为固定格式字符串('DAY' | 'HOUR' | 'MINUTE' | 'SECOND')。 可以通过设置GUC参数IntervalStyle为a,兼容该函数interval输出格式。 返回值类型:interval 示例: 1 2 3 4 5 6 7 8 910111213 gaussdb=# SELECT numtodsinterval(100, 'HOUR'); numtodsinterval ----------------- 100:00:00(1 row)gaussdb=# SET intervalstyle = a;SETgaussdb=# SELECT numtodsinterval(100, 'HOUR'); numtodsinterval------------------------------- +000000004 04:00:00.000000000(1 row) 此函数在参数a_format_version值为10c和a_format_dev_version值为s2的情况下:当参数interval_unit为 'DAY' 时,参数num超过1000000000会报错。 numtoyminterval(num, interval_unit) 描述:将数字转换为interval类型。num为numeric类型数字,interval_unit为固定格式字符串('YEAR' | 'MONTH')。 可以通过设置GUC参数IntervalStyle为a,兼容该函数interval输出格式。 返回值类型:interval 示例: 1 2 3 4 5 6 7 8 910111213 gaussdb=# SELECT numtoyminterval(100, 'MONTH'); numtoyminterval ----------------- 8 years 4 mons(1 row)gaussdb=# SET intervalstyle = oracle;SETgaussdb=# SELECT numtodsinterval(100, 'MONTH'); numtoyminterval ----------------- 8-4(1 row) 此函数在参数a_format_version值为10c和a_format_dev_version值为s2的情况下有效。 new_time(date, timezone1,timezone2) 描述:当timezone1所表示时区的日期时间为date的时候,返回此时timezone2所表示时区的日期时间值。 返回值类型:timestamp 示例: 1 2 3 4 5 6 7 8 910 gaussdb=# select new_time('1997-10-10','AST','EST'); new_time --------------------- 1997-10-09 23:00:00(1 row)gaussdb=# SELECT NEW_TIME(TO_TIMESTAMP ('10-Sep-02 14:10:10.123000','DD-Mon-RR HH24:MI:SS.FF'), 'AST', 'PST'); new_time ------------------------- 2002-09-10 10:10:10.123(1 row) 此函数在参数a_format_version值为10c和a_format_dev_version值为s2的情况下生效。 sessiontimezone 描述:当前会话的时区,无入参。 返回值类型:text。 示例: 1 2 3 4 5 6 7 8 910 gaussdb=# SELECT SESSIONTIMEZONE; session_time_zone ------------------- PST8PDT(1 row)gaussdb=# SELECT LOWER(SESSIONTIMEZONE); lower ----------- @ 8 hours(1 row) 此函数在参数a_format_version值为10c和a_format_dev_version值为s2的情况下生效。 sys_extract_utc(timestamp| timestamptz) 描述:从具有时区偏移量或时区区域名称的日期时间值中提取UTC(协调世界时-以前称为格林威治平均时间)。如果未指定时区,则日期时间与会话时区关联。入参有timestmp和timestamp两种形式。 返回值类型:timestamp。 示例: 1 2 3 4 5 6 7 8 910 gaussdb=# SELECT SYS_EXTRACT_UTC(TIMESTAMP '2000-03-28 11:30:00.00'); sys_extract_utc --------------------- 2000-03-28 03:30:00(1 row)gaussdb=# SELECT SYS_EXTRACT_UTC(TIMESTAMPTZ '2000-03-28 11:30:00.00 -08:00'); sys_extract_utc --------------------- 2000-03-28 19:30:00(1 row) 此函数在参数a_format_version值为10c和a_format_dev_version值为s2的情况下有效。 tz_offset('time_zone_name' | '(+/-)hh:mi' | SESSIONTIMEZONE | DBTIMEZONE) 描述:入参有以上四种形式,返回入参所表示时区的UTC偏移量。 返回值类型:text。 示例: 1 2 3 4 5 6 7 8 910 gaussdb=# SELECT TZ_OFFSET('US/Pacific'); tz_offset ----------- -08:00(1 row)gaussdb=# SELECT TZ_OFFSET(sessiontimezone); tz_offset ----------- +08:00(1 row) 此函数在参数a_format_version值为10c和a_format_dev_version值为s2的情况下生效。 pg_sleep(seconds) 描述:服务器线程延迟时间,单位为秒。 返回值类型:void 示例: 12345 gaussdb=# SELECT pg_sleep(10); pg_sleep ----------(1 row) statement_timestamp() 描述:当前日期及时间。 返回值类型:timestamp with time zone 示例: 12345 gaussdb=# SELECT statement_timestamp(); statement_timestamp ------------------------------- 2017-09-01 17:04:39.119267+08(1 row) sysdate 描述:当前日期及时间。 返回值类型:timestamp 示例: 12345 gaussdb=# SELECT sysdate; sysdate --------------------- 2017-09-01 17:04:49(1 row) timeofday() 描述:当前日期及时间(像clock_timestamp,但是返回时为text)。 返回值类型:text 示例: 12345 gaussdb=# SELECT timeofday(); timeofday ------------------------------------- Fri Sep 01 17:05:01.167506 2017 CS T(1 row) transaction_timestamp() 描述:当前日期及时间,与current_timestamp等效。 返回值类型:timestamp with time zone 示例: 12345 gaussdb=# SELECT transaction_timestamp(); transaction_timestamp ------------------------------- 2017-09-01 17:05:13.534454+08(1 row) add_months(d,n) 描述:用于计算时间点d再加上n个月的时间。 d:timestamp类型的值,以及可以隐式转换为timestamp类型的值。 n:INTEGER类型的值,以及可以隐式转换为INTEGER类型的值。 返回值类型:timestamp 示例: 12345 gaussdb=# SELECT add_months(to_date('2017-5-29', 'yyyy-mm-dd'), 11) FROM sys_dummy; add_months --------------------- 2018-04-29 00:00:00(1 row) 此函数在参数a_format_version值为10c和a_format_dev_version值为s1的情况下: 当计算结果大于公元9999年时会报错。 参数n入参若为小数则不会被四舍五入,而是被截断。 last_day(d) 描述:用于计算时间点d当月最后一天的时间。 返回值类型:timestamp 示例: 12345 gaussdb=# select last_day(to_date('2017-01-01', 'YYYY-MM-DD')) AS cal_result; cal_result --------------------- 2017-01-31 00:00:00(1 row)
  • 内置函数 HLL(HyperLogLog)有一系列内置函数用于内部对数据进行处理,一般情况下用户不需要熟知这些函数的使用。详情见表1。 表1 内置函数 函数名称 功能描述 hll_in 以string格式接收hll数据。 hll_out 以string格式发送hll数据。 hll_recv 以bytea格式接收hll数据。 hll_send 以bytea格式发送hll数据。 hll_trans_in 以string格式接收hll_trans_type数据。 hll_trans_out 以string格式发送hll_trans_type数据。 hll_trans_recv 以bytea形式接收hll_trans_type数据。 hll_trans_send 以bytea形式发送hll_trans_type数据。 hll_typmod_in 接收typmod类型数据。 hll_typmod_out 发送typmod类型数据。 hll_hashval_in 接收hll_hashval类型数据。 hll_hashval_out 发送hll_hashval类型数据。 hll_add_trans0 类似于hll_add所提供的功能,初始化时无指定入参,通常在聚合运算的第一阶段DN上使用。 hll_add_trans1 类似于hll_add所提供的功能,初始化时指定一个入参,通常在聚合运算的第一阶段DN上使用。 hll_add_trans2 类似于hll_add所提供的功能,初始化时指定两个入参,通常在聚合运算的第一阶段DN上使用。 hll_add_trans3 类似于hll_add所提供的功能,初始化时指定三个入参,通常在聚合运算的第一阶段DN上使用。 hll_add_trans4 类似于hll_add所提供的功能,初始化时指定四个入参,通常在聚合运算的第一阶段DN上使用。 hll_union_trans 类似hll_union所提供的功能,在聚合运算的第一阶段DN上使用。 hll_union_collect 类似于hll_union所提供的功能,在聚合运算第二阶段DN上使用,汇总各个DN上的结果。 hll_pack 在聚合运算第三阶段DN上使用,把自定义hll_trans_type类型最后转换成hll类型。 hll 用于hll类型转换成hll类型,根据输入参数会设定指定参数。 hll_hashval 用于bigint类型转换成hll_hashval类型。 hll_hashval_int4 用于int4类型转换成hll_hashval类型。
  • 聚合函数 hll_add_agg(hll_hashval) 描述:把哈希后的数据按照分组放到hll中。 返回值类型:hll 示例: 1 2 3 4 5 6 7 8 910111213141516171819 --准备数据gaussdb=# create table t_id(id int);gaussdb=# insert into t_id values(generate_series(1,500));gaussdb=# create table t_data(a int, c text);gaussdb=# insert into t_data select mod(id,2), id from t_id;--创建表并指定列为hllgaussdb=# create table t_a_c_hll(a int, c hll);--根据a列group by对数据分组,把各组数据加到hll中gaussdb=# insert into t_a_c_hll select a, hll_add_agg(hll_hash_text(c)) from t_data group by a;--得到每组数据中hll的Distinct值gaussdb=# select a, #c as cardinality from t_a_c_hll order by a; a | cardinality ---+------------------ 0 | 247.862354346299 1 | 250.908710610377(2 rows) hll_add_agg(hll_hashval, int32 log2m) 描述:把哈希后的数据按照分组放到hll中, 并指定参数log2m,取值范围是10到16。若输入-1或者NULL,则采用内置默认值。 返回值类型:hll 示例: 12345 gaussdb=# select hll_cardinality(hll_add_agg(hll_hash_text(c), 12)) from t_data; hll_cardinality ------------------ 497.965240179228(1 row) hll_add_agg(hll_hashval, int32 log2m, int32 log2explicit) 描述:把哈希后的数据按照分组放到hll中,依次指定参数log2m、log2explicit。 log2explicit取值范围是0到12,0表示直接跳过Explicit模式。该参数可以用来设置Explicit模式的阈值大小,在数据段长度达到2log2explicit后切换为Sparse模式或者Full模式。若输入-1或者NULL,则log2explicit采用内置默认值。 返回值类型:hll 示例: 12345 gaussdb=# select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 1)) from t_data; hll_cardinality ------------------ 498.496062953313(1 row) hll_add_agg(hll_hashval, int32 log2m, int32 log2explicit, int64 log2sparse) 描述:把哈希后的数据按照分组放到hll中, 依次指定参数log2m、log2explicit、log2sparse。,log2sparse取值范围是0到14,0表示直接跳过Sparse模式。该参数可以用来设置Sparse模式的阈值大小,在数据段长度达到2log2sparse后切换为Full模式。若输入-1或者NULL,则log2sparse采用内置默认值。 返回值类型:hll 示例: 12345 gaussdb=# select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 6, 10)) from t_data; hll_cardinality ------------------ 498.496062953313(1 row) hll_add_agg(hll_hashval, int32 log2m, int32 log2explicit, int64 log2sparse, int32 duplicatecheck) 描述:把哈希后的数据按照分组放到hll中, 依次制定参数log2m、log2explicit、log2sparse、duplicatecheck,duplicatecheck取值范围是0或者1,表示是否开启该模式,默认情况下该模式会关闭。若输入-1或者NULL,则duplicatecheck采用内置默认值。 返回值类型:hll 示例: 12345 gaussdb=# select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 6, 10, -1)) from t_data; hll_cardinality ------------------ 498.496062953313(1 row) hll_union_agg(hll) 描述:将多个hll类型数据union成一个hll。 返回值类型:hll 示例: 123456 --将各组中的hll数据union成一个hll,并计算distinct值。gaussdb=# select #hll_union_agg(c) as cardinality from t_a_c_hll; cardinality ------------------ 498.496062953313(1 row) 注意:当两个或者多个hll数据结构做union的时候,必须要保证其中每一个hll里面的精度参数一样,否则将不可以进行union。同样的约束也适用于函数hll_union(hll,hll)。
  • 废弃函数 由于版本升级,HLL(HyperLogLog)有一些旧的函数废弃,用户可以用类似的函数进行替代。 hll_schema_version(hll) 描述:查看当前hll中的schema version。旧版本schema version是常值1,用来进行hll字段的头部校验,重构后的hll在头部增加字段“HLL”进行校验,schema version不再使用。 hll_regwidth(hll) 描述:查看hll数据结构中桶的位数大小。旧版本桶的位数regwidth取值1~5,会存在较大的误差,也限制了基数估计上限。 重构后regwidth为固定值6,不再使用regwidth变量。 hll_expthresh(hll) 描述:得到当前hll中expthresh大小。采用hll_log2explicit(hll)替代类似功能。 hll_sparseon(hll) 描述:是否启用Sparse模式。采用hll_log2sparse(hll)替代类似功能,0表示关闭Sparse模式。
  • 功能函数 hll_empty() 描述:创建一个空的hll。 返回值类型:hll 示例: 12345 gaussdb=# select hll_empty(); hll_empty------------------------------------------------------------ \x484c4c00000000002b05000000000000000000000000000000000000(1 row) hll_empty(int32 log2m) 描述:创建空的hll并指定参数log2m,取值范围是10到16。若输入-1,则采用内置默认值。 返回值类型:hll 示例: 1 2 3 4 5 6 7 8 91011 gaussdb=# select hll_empty(10); hll_empty------------------------------------------------------------ \x484c4c00000000002b04000000000000000000000000000000000000(1 row)gaussdb=# select hll_empty(-1); hll_empty------------------------------------------------------------ \x484c4c00000000002b05000000000000000000000000000000000000(1 row) hll_empty(int32 log2m, int32 log2explicit) 描述:创建空的hll并依次指定参数log2m、log2explicit。log2explicit取值范围是0到12,0表示直接跳过Explicit模式。该参数可以用来设置Explicit模式的阈值大小,在数据段长度达到2log2explicit后切换为Sparse模式或者Full模式。若输入-1,则log2explicit采用内置默认值。 返回值类型: hll 示例: 1 2 3 4 5 6 7 8 91011 gaussdb=# select hll_empty(10, 4); hll_empty------------------------------------------------------------ \x484c4c00000000001304000000000000000000000000000000000000(1 row)gaussdb=# select hll_empty(10, -1); hll_empty------------------------------------------------------------ \x484c4c00000000002b04000000000000000000000000000000000000(1 row) hll_empty(int32 log2m, int32 log2explicit, int64 log2sparse) 描述:创建空的hll并依次指定参数log2m、log2explicit、log2sparse。log2sparse取值范围是0到14,0表示直接跳过Sparse模式。该参数可以用来设置Sparse模式的阈值大小,在数据段长度达到2log2sparse后切换为Full模式。若输入-1,则log2sparse采用内置默认值。 返回值类型:hll 示例: 1 2 3 4 5 6 7 8 91011 gaussdb=# select hll_empty(10, 4, 8); hll_empty------------------------------------------------------------ \x484c4c00000000001204000000000000000000000000000000000000(1 row)gaussdb=# select hll_empty(10, 4, -1); hll_empty------------------------------------------------------------ \x484c4c00000000001304000000000000000000000000000000000000(1 row) hll_empty(int32 log2m, int32 log2explicit, int64 log2sparse, int32 duplicatecheck) 描述:创建空的hll并依次指定参数log2m、log2explicit、log2sparse、duplicatecheck。duplicatecheck取0或者1,表示是否开启该模式,默认情况下该模式会关闭。若输入-1,则duplicatecheck采用内置默认值。 返回值类型:hll 示例: 1 2 3 4 5 6 7 8 91011 gaussdb=# select hll_empty(10, 4, 8, 0); hll_empty------------------------------------------------------------ \x484c4c00000000001204000000000000000000000000000000000000(1 row)gaussdb=# select hll_empty(10, 4, 8, -1); hll_empty------------------------------------------------------------ \x484c4c00000000001204000000000000000000000000000000000000(1 row) hll_add(hll, hll_hashval) 描述:把hll_hashval加入到hll中。 返回值类型:hll 示例: 12345 gaussdb=# select hll_add(hll_empty(), hll_hash_integer(1)); hll_add---------------------------------------------------------------------------- \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00(1 row) hll_add_rev(hll_hashval, hll) 描述:把hll_hashval加入到hll中,和hll_add功能一样,只是参数位置进行了交换。 返回值类型:hll 示例: 12345 gaussdb=# select hll_add_rev(hll_hash_integer(1), hll_empty()); hll_add_rev---------------------------------------------------------------------------- \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00(1 row) hll_eq(hll, hll) 描述:比较两个hll是否相等。 返回值类型:bool 示例: 12345 gaussdb=# select hll_eq(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2))); hll_eq -------- f(1 row) hll_ne(hll, hll) 描述:比较两个hll是否不相等。 返回值类型:bool 示例: 12345 gaussdb=# select hll_ne(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2))); hll_ne -------- t(1 row) hll_cardinality(hll) 描述:计算hll的distinct值。 返回值类型:int 示例: 12345 gaussdb=# select hll_cardinality(hll_empty() || hll_hash_integer(1)); hll_cardinality ----------------- 1(1 row) hll_union(hll, hll) 描述:把两个hll数据结构union成一个。 返回值类型:hll 示例: 12345 gaussdb=# select hll_union(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2))); hll_union-------------------------------------------------------------------------------------------- \x484c4c10002000002b090000000000000000400000000000000000b3ccc49320cca1ae3e2921ff133fbaed00(1 row)
  • 日志函数 hll主要存在三种模式Explicit,Sparse,Full。当数据规模比较小的时候会使用Explicit模式,这种模式下distinct值的计算是没有误差的;随着distinct值越来越多,hll会先后转换为Sparse模式和Full模式,这两种模式在计算结果上没有任何区别,只影响hll函数的计算效率和hll对象的存储空间。下面的函数可以用于查看hll的一些参数。 hll_print(hll) 描述:打印hll的一些debug参数信息。 示例: 12345 gaussdb=# select hll_print(hll_empty()); hll_print------------------------------------------------------------------------------- type=1(HLL_EMPTY), log2m=14, log2explicit=10, log2sparse=12, duplicatecheck=0(1 row) hll_type(hll) 描述:查看当前hll的类型。返回值具体含义如下:返回值0,表示HLL_UNINIT,未初始化的hll对象;返回值1,表示HLL_EMPTY,hll空对象;返回值2,表示HLL_EXPLICIT,Explicit模式的hll对象;返回值3,表示HLL_SPARSE,Sparse模式的hll对象;返回值4,表示HLL_FULL,Full模式的hll对象;返回值5,表示HLL_UNDEFINED,不合法的hll对象。 示例: 12345 gaussdb=# select hll_type(hll_empty()); hll_type ---------- 1(1 row) hll_log2m(hll) 描述:查看当前hll数据结构中的log2m数值,log2m是分桶数的对数值,此值会影响最后hll计算distinct误差率,误差率计算公式为±1.04/√(2 ^ log2m)。当显式指定log2m的取值为10-16之间时,hll会设置分桶数为2log2m。当显示指定log2explicit为-1时,会采用内置默认值。 示例: 1 2 3 4 5 6 7 8 91011121314151617 gaussdb=# select hll_log2m(hll_empty()); hll_log2m----------- 14(1 row)gaussdb=# select hll_log2m(hll_empty(10)); hll_log2m----------- 10(1 row)gaussdb=# select hll_log2m(hll_empty(-1)); hll_log2m----------- 14(1 row) hll_log2explicit(hll) 描述:查看当前hll数据结构中的log2explicit数值。hll通常会由Explicit模式到Sparse模式再到Full模式,这个过程称为promotion hierarchy策略。可以通过调整log2explicit值的大小改变策略,比如log2explicit为0的时候就会跳过Explicit模式而直接进入Sparse模式。当显式指定log2explicit的取值为1-12之间时,hll会在数据段长度超过2log2explicit时转为Sparse模式。当显示指定log2explicit为-1时,会采用内置默认值。 示例: 1 2 3 4 5 6 7 8 91011121314151617 gaussdb=# select hll_log2explicit(hll_empty()); hll_log2explicit------------------ 10(1 row)gaussdb=# select hll_log2explicit(hll_empty(12, 8)); hll_log2explicit------------------ 8(1 row)gaussdb=# select hll_log2explicit(hll_empty(12, -1)); hll_log2explicit------------------ 10(1 row) hll_log2sparse(hll) 描述:查看当前hll数据结构中的log2sparse数值。hll通常会由Explicit模式到Sparse模式再到Full模式,这个过程称为promotion hierarchy策略。可以通过调整log2sparse值的大小改变策略,比如log2sparse为0的时候就会跳过Sparse模式而直接进入Full模式。当显式指定Sparse的取值为1-14之间时,hll会在数据段长度超过2log2sparse时转为Full模式。当显示指定log2sparse为-1时,会采用内置默认值。 示例: 1 2 3 4 5 6 7 8 91011121314151617 gaussdb=# select hll_log2sparse(hll_empty()); hll_log2sparse---------------- 12(1 row)gaussdb=# select hll_log2sparse(hll_empty(12, 8, 10)); hll_log2sparse---------------- 10(1 row)gaussdb=# select hll_log2sparse(hll_empty(12, 8, -1)); hll_log2sparse---------------- 12(1 row) hll_duplicatecheck(hll) 描述:是否启用duplicatecheck,0是关闭,1是开启。默认关闭,对于有较多重复值出现的情况,可以开启以提高效率。当显示指定duplicatecheck为-1时,会采用内置默认值。 示例: 1 2 3 4 5 6 7 8 91011121314151617 gaussdb=# select hll_duplicatecheck(hll_empty()); hll_duplicatecheck-------------------- 0(1 row)gaussdb=# select hll_duplicatecheck(hll_empty(12, 8, 10, 1)); hll_duplicatecheck-------------------- 1(1 row)gaussdb=# select hll_duplicatecheck(hll_empty(12, 8, 10, -1)); hll_duplicatecheck-------------------- 0(1 row)
  • 下标生成函数 generate_subscripts(array anyarray, dim int) 描述:生成一系列包括给定数组的下标。 返回值类型:setof int generate_subscripts(array anyarray, dim int, reverse boolean) 描述:生成一系列包括给定数组的下标。当reverse为真时,该系列则以相反的顺序返回。 返回值类型:setof int
  • 序列号生成函数 generate_series(start, stop) 描述:生成一个数值序列,从start到stop,步长为1。 参数类型:int、bigint、numeric 返回值类型:setof int、setof bigint、setof numeric(与参数类型相同) generate_series(start, stop, step) 描述:生成一个数值序列,从start到stop,步长为step。 参数类型:int、bigint、numeric 返回值类型:setof int、setof bigint、setof numeric(与参数类型相同) generate_series(start, stop, step interval) 描述:生成一个数值序列,从start到stop,步长为step。 参数类型:timestamp或timestamp with time zone 返回值类型:setof timestamp或setof timestamp with time zone(与参数类型相同)
  • 数组函数 array_append(anyarray, anyelement) 描述:向数组末尾添加元素,只支持一维数组。 返回类型:anyarray 示例: 12345 gaussdb=# SELECT array_append(ARRAY[1,2], 3) AS RESULT; result --------- {1,2,3}(1 row) array_prepend(anyelement, anyarray) 描述:向数组开头添加元素,只支持一维数组。 返回类型:anyarray 示例: 12345 gaussdb=# SELECT array_prepend(1, ARRAY[2,3]) AS RESULT; result --------- {1,2,3}(1 row) array_cat(anyarray, anyarray) 描述:连接两个数组,支持多维数组。 返回类型:anyarray 示例: 1 2 3 4 5 6 7 8 91011 gaussdb=# SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]) AS RESULT; result ------------- {1,2,3,4,5}(1 row)gaussdb=# SELECT array_cat(ARRAY[[1,2],[4,5]], ARRAY[6,7]) AS RESULT; result --------------------- {{1,2},{4,5},{6,7}}(1 row) array_ndims(anyarray) 描述:返回数组的维数。 返回类型:int 示例: 12345 gaussdb=# SELECT array_ndims(ARRAY[[1,2,3], [4,5,6]]) AS RESULT; result -------- 2(1 row) array_dims(anyarray) 描述:返回数组各个维度中的低位下标值和高位下标值。 返回类型:text 示例: 12345 gaussdb=# SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]) AS RESULT; result ------------ [1:2][1:3](1 row) array_length(anyarray, int) 描述:返回指定数组维度的长度。int为指定数组维度。 返回类型:int 示例: 1 2 3 4 5 6 7 8 91011 gaussdb=# SELECT array_length(array[1,2,3], 1) AS RESULT; result -------- 3(1 row)gaussdb=# SELECT array_length(array[[1,2,3],[4,5,6]], 2) AS RESULT; result-------- 3(1 row) array_lower(anyarray, int) 描述:返回指定数组维数的下界。int为指定数组维度。 返回类型:int 示例: 12345 gaussdb=# SELECT array_lower('[0:2]={1,2,3}'::int[], 1) AS RESULT; result -------- 0(1 row) array_upper(anyarray, int) 描述:返回指定数组维数的上界。int为指定数组维度。 返回类型:int 示例: 12345 gaussdb=# SELECT array_upper(ARRAY[1,8,3,7], 1) AS RESULT; result -------- 4(1 row) array_upper(anyarray, int) 描述:返回指定数组维数的上界。int为指定数组维度。 返回类型:int 示例: gaussdb=# SELECT array_upper(ARRAY[1,8,3,7], 1) AS RESULT; result -------- 4(1 row) array_to_string(anyarray, text [, text]) 描述:使用第一个text作为数组的新分隔符,使用第二个text替换数组值为null的值。 返回类型:text 示例: 12345 gaussdb=# SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*') AS RESULT; result ----------- 1,2,3,*,5(1 row) array_delete(anyarray) 描述:清空数组中的元素并返回一个同类型的空数组。 返回类型:anyarray 示例: gaussdb=# SELECT array_delete(ARRAY[1,8,3,7]) AS RESULT; result -------- {}(1 row) array_deleteidx(anyarray, int) 描述:从数组中删除指定下标的元素并返回剩余元素组成的数组。 返回类型:anyarray 示例: gaussdb=# SELECT array_deleteidx(ARRAY[1,2,3,4,5], 1) AS RESULT; result----------- {2,3,4,5}(1 row) array_deleteidx(anyarray, int)此函数在参数a_format_version值为10c和a_format_dev_version值为s1的情况下被禁用。 array_extendnull(anyarray, int) 描述:往数组尾部添加指定个数的null空元素。 返回类型:anyarray 示例: gaussdb=# SELECT array_extendnull(ARRAY[1,8,3,7],1) AS RESULT; result --------------{1,8,3,7,null}(1 row) array_extendnull(anyarray, int, int) 描述:往数组尾部添加指定个数的指定索引的元素。 返回类型:anyarray 示例: gaussdb=# SELECT array_extendnull(ARRAY[1,8,3,7],2,2) AS RESULT; result --------------{1,8,3,7,8,8}(1 row) array_extendnull(anyarray, int, int)此函数在参数a_format_version值为10c和a_format_dev_version值为s1的情况下有效。 array_trim(anyarray, int) 描述:从数组尾部删除指定个数个元素。 返回类型:anyarray 示例: gaussdb=# SELECT array_trim(ARRAY[1,8,3,7],1) AS RESULT; result--------- {1,8,3}(1 row) array_exists(anyarray, int) 描述:检查第二个参数是否是数组的合法下标。 返回类型:boolean 示例: gaussdb=# SELECT array_exists(ARRAY[1,8,3,7],1) AS RESULT; result -------- t(1 row) array_next(anyarray, int) 描述:根据第二个入参返回数组中指定下标元素的下一个元素的下标。 返回类型:int 示例: gaussdb=# SELECT array_next(ARRAY[1,8,3,7],1) AS RESULT; result -------- 2(1 row) array_prior(anyarray, int) 描述:根据第二个入参返回数组中指定下标元素的上一个元素的下标。 返回类型:int 示例: gaussdb=# SELECT array_prior(ARRAY[1,8,3,7],2) AS RESULT; result -------- 1(1 row) string_to_array(text, text [, text]) 描述:使用第二个text指定分隔符,使用第三个可选的text作为NULL值替换模板,如果分隔后的子串与第三个可选的text完全匹配,则将其替换为NULL。 返回类型:text[] 示例: 1 2 3 4 5 6 7 8 910 gaussdb=# SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy') AS RESULT; result -------------- {xx,NULL,zz}(1 row)gaussdb=# SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'y') AS RESULT; result ------------ {xx,yy,zz}(1 row) unnest(anyarray) 描述:扩大一个数组为一组行。 返回类型:setof anyelement 示例: 123456 gaussdb=# SELECT unnest(ARRAY[1,2]) AS RESULT; result -------- 1 2(2 rows)
  • 账本数据库的函数 当前特性是实验室特性,使用时请联系华为工程师提供技术支持。 get_dn_hist_relhash(text, text) 描述:返回指定防篡改用户表的表级数据hash值。该函数集中式暂不支持。 参数类型:text 返回值类型:hash16 ledger_hist_check(text, text) 描述:校验指定防篡改用户表的表级数据hash值与其对应历史表hash一致性。 参数类型:text 返回值类型:Boolean ledger_hist_repair(text, text) 描述:修复指定防篡改用户表对应的历史表hash值,使之与用户表hash一致,返回hash差值。 参数类型:text 返回值类型:hash16 ledger_hist_archive(text, text) 描述:归档指定防篡改用户表对应的历史表至审计日志目录中hist_back文件夹下。 参数类型:text 返回值类型:Boolean ledger_gchain_check(text, text) 描述:校验指定防篡改用户表对应的历史表hash与全局历史表对应的relhash一致性。 参数类型:text 返回值类型:Boolean ledger_gchain_repair(text, text) 描述:修复验指定防篡改用户表在全局历史表中的relhash,使之与其历史表hash一致,返回hash差值。 参数类型:text 返回值类型:hash16 ledger_gchain_archive(void) 描述:归档全局历史表至审计日志目录中hist_back文件夹下。 参数类型:void 返回值类型:Boolean hash16in(cstring) 描述:将输入16进制字符串转化成内部hash16形式。 参数类型:cstring 返回值类型:hash16 hash16out(hash16) 描述:将内部hash16类型的数据转码转化为16进制cstring类型。 参数类型:hash16 返回值类型:cstring hash32in(cstring) 描述:将输入16进制字符串(32个字符)转化成内部类型hash32形式。 参数类型:cstring 返回值类型:hash32 hash32out(hash32) 描述:将内部hash32类型的数据转码转化为16进制cstring类型。 参数类型:cstring 返回值类型:hash32 父主题: 函数和操作符
  • 范围函数 numrange(numeric, numeric, [text]) 描述:表示一个范围。 返回类型:范围元素类型 示例: 1 2 3 4 5 6 7 8 910 gaussdb=# SELECT numrange(1.1,2.2) AS RESULT; result --------[1.1,2.2)(1 row)gaussdb=# SELECT numrange(1.1,2.2, '()') AS RESULT; result --------(1.1,2.2)(1 row) lower(anyrange) 描述:范围的下界 返回类型:范围元素类型 示例: 12345 gaussdb=# SELECT lower(numrange(1.1,2.2)) AS RESULT; result -------- 1.1(1 row) upper(anyrange) 描述:范围的上界 返回类型:范围元素类型 示例: 12345 gaussdb=# SELECT upper(numrange(1.1,2.2)) AS RESULT; result -------- 2.2(1 row) isempty(anyrange) 描述:范围是否为空 返回类型:Boolean 示例: 12345 gaussdb=# SELECT isempty(numrange(1.1,2.2)) AS RESULT; result -------- f(1 row) lower_inc(anyrange) 描述:是否包含下界 返回类型:Boolean 示例: 12345 gaussdb=# SELECT lower_inc(numrange(1.1,2.2)) AS RESULT; result -------- t(1 row) upper_inc(anyrange) 描述:是否包含上界 返回类型:Boolean 示例: 12345 gaussdb=# SELECT upper_inc(numrange(1.1,2.2)) AS RESULT; result -------- f(1 row) lower_inf(anyrange) 描述:下界是否为无穷 返回类型:Boolean 示例: 12345 gaussdb=# SELECT lower_inf('(,)'::daterange) AS RESULT; result -------- t(1 row) upper_inf(anyrange) 描述:上界是否为无穷 返回类型:Boolean 示例: 12345 gaussdb=# SELECT upper_inf('(,)'::daterange) AS RESULT; result -------- t(1 row) 如果范围是空或者需要的界限是无穷的,lower和upper函数将返回null。lower_inc、upper_inc、lower_inf和upper_inf函数均对空范围返回false。
  • SEQUENCE函数 序列函数为用户从序列对象中获取后续的序列值提供了简单的多用户安全的方法。 nextval(regclass) 描述:递增序列并返回新值。 为了避免从同一个序列获取值的并发事务被阻塞,nextval操作不会回滚;也就是说,一旦一个值已经被抓取,那么就认为它已经被用过了,并且不会再被返回。即使该操作处于事务中,当事务之后中断,或者如果调用查询结束不使用该值,也是如此。这种情况将在指定值的顺序中留下未使用的“空洞”。因此,GaussDB Kernel序列对象不能用于获得“无间隙”序列。 nextval函数只能在主机上执行,备机不支持执行此函数。 返回类型:numeric nextval函数有两种调用方式(其中第二种调用方式目前不支持Sequence命名中有特殊字符"."的情况),如下: 示例1: 12345 gaussdb=# select nextval('seqDemo'); nextval--------- 2(1 row) 示例2: 12345 gaussdb=# select seqDemo.nextval; nextval--------- 2(1 row) currval(regclass) 返回当前会话里最近一次nextval返回的指定的sequence的数值。如果当前会话还没有调用过指定的sequence的nextval,那么调用currval将会报错。 返回类型:numeric currval函数有两种调用方式(其中第二种调用方式目前不支持Sequence命名中有特殊字符"."的情况),如下: 示例1: 12345 gaussdb=# select currval('seq1'); currval--------- 2(1 row) 示例2: 12345 gaussdb=# select seq1.currval; currval--------- 2(1 row) lastval() 描述:返回当前会话里最近一次nextval返回的数值。这个函数等效于currval,只是它不用序列名为参数,它抓取当前会话里面最近一次nextval使用的序列。如果当前会话还没有调用过nextval,那么调用lastval将会报错。 返回类型:numeric 示例: 12345 gaussdb=# select lastval(); lastval--------- 2(1 row) setval(regclass, numeric) 描述:设置序列的当前数值。 返回类型:numeric 示例: 12345 gaussdb=# select setval('seqDemo',1); setval-------- 1(1 row) setval(regclass, numeric, Boolean) 描述:设置序列的当前数值以及is_called标志。 返回类型:numeric 示例: 12345 gaussdb=# select setval('seqDemo',1,true); setval-------- 1(1 row) Setval后当前会话会立刻生效,但如果其他会话有缓存的序列值,只能等到缓存值用尽才能感知Setval的作用。所以为了避免序列值冲突,setval要谨慎使用。 因为序列是非事务的,setval造成的改变不会由于事务的回滚而撤销。 nextval函数只能在主机上执行,备机不支持执行此函数。 pg_sequence_last_value(sequence_oid oid, OUT cache_value int16, OUT last_value int16) 描述:获取指定sequence的参数,包含缓存值,当前值。 返回类型:int16,int16 last_insert_id() 描述:获取最近一次为自动增长列成功插入的第一个自动生成的值。 返回类型:int16 last_insert_id(int16) 描述:设置下一次last_insert_id()函数的返回值,并返回此值。若参数为NULL,将下一次last_insert_id()函数的返回值设为0,此函数返回NULL。 返回值类型:int16 示例: 1 2 3 4 5 6 7 8 910 gaussdb=# select last_insert_id(100); last_insert_id---------------- 100(1 row)gaussdb=# select last_insert_id(); last_insert_id---------------- 100(1 row) last_insert_id()和last_insert_id(int16)是会话级别的函数,若当前会话未对自动增长列插入任何数据,last_insert_id()返回值为0。 last_insert_id()和last_insert_id(int16)仅在参数sql_compatibility='B'时可用。 父主题: 函数和操作符
  • JSON/JSONB支持的函数 array_to_json(anyarray [, pretty_bool]) 描述:返回JSON类型的数组。将一个多维数组组成一个JSON数组。如果pretty_bool为true,将在一维元素之间添加换行符。 返回类型:json 示例: gaussdb=# 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 示例: gaussdb=# SELECT row_to_json(row(1,'foo')); row_to_json --------------------- {"f1":1,"f2":"foo"} (1 row)
  • 文本检索调试函数 ts_debug([ config regconfig, ] document text, OUT alias text, OUT description text, OUT token text, OUT dictionaries regdictionary[], OUT dictionary regdictionary, OUT lexemes text[]) 描述:测试一个配置。 返回类型:setof record 示例: 123456789 gaussdb=# SELECT ts_debug('english', 'The Brightest supernovaes'); ts_debug ----------------------------------------------------------------------------------- (asciiword,"Word, all ASCII",The,{english_stem},english_stem,{}) (blank,"Space symbols"," ",{},,) (asciiword,"Word, all ASCII",Brightest,{english_stem},english_stem,{brightest}) (blank,"Space symbols"," ",{},,) (asciiword,"Word, all ASCII",supernovaes,{english_stem},english_stem,{supernova})(5 rows) ts_lexize(dict regdictionary, token text) 描述:测试一个数据字典。 返回类型:text[] 示例: 12345 gaussdb=# SELECT ts_lexize('english_stem', 'stars'); ts_lexize ----------- {star}(1 row) ts_parse(parser_name text, document text, OUT tokid integer, OUT token text) 描述:测试一个解析。 返回类型:setof record 示例: 12345678 gaussdb=# SELECT ts_parse('default', 'foo - bar'); ts_parse ----------- (1,foo) (12," ") (12,"- ") (1,bar)(4 rows) ts_parse(parser_oid oid, document text, OUT tokid integer, OUT token text) 描述:测试一个解析。 返回类型:setof record 示例: 12345678 gaussdb=# SELECT ts_parse(3722, 'foo - bar'); ts_parse ----------- (1,foo) (12," ") (12,"- ") (1,bar)(4 rows) ts_token_type(parser_name text, OUT tokid integer, OUT alias text, OUT description text) 描述:获取分析器定义的记号类型。 返回类型:setof record 示例: 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627 gaussdb=# SELECT ts_token_type('default'); ts_token_type -------------------------------------------------------------- (1,asciiword,"Word, all ASCII") (2,word,"Word, all letters") (3,numword,"Word, letters and digits") (4,email,"Email address") (5,url,URL) (6,host,Host) (7,sfloat,"Scientific notation") (8,version,"Version number") (9,hword_numpart,"Hyphenated word part, letters and digits") (10,hword_part,"Hyphenated word part, all letters") (11,hword_asciipart,"Hyphenated word part, all ASCII") (12,blank,"Space symbols") (13,tag,"XML tag") (14,protocol,"Protocol head") (15,numhword,"Hyphenated word, letters and digits") (16,asciihword,"Hyphenated word, all ASCII") (17,hword,"Hyphenated word, all letters") (18,url_path,"URL path") (19,file,"File or path name") (20,float,"Decimal notation") (21,int,"Signed integer") (22,uint,"Unsigned integer") (23,entity,"XML entity")(23 rows) ts_token_type(parser_oid oid, OUT tokid integer, OUT alias text, OUT description text) 描述:获取分析器定义的记号类型。 返回类型:setof record 示例: 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627 gaussdb=# SELECT ts_token_type(3722); ts_token_type -------------------------------------------------------------- (1,asciiword,"Word, all ASCII") (2,word,"Word, all letters") (3,numword,"Word, letters and digits") (4,email,"Email address") (5,url,URL) (6,host,Host) (7,sfloat,"Scientific notation") (8,version,"Version number") (9,hword_numpart,"Hyphenated word part, letters and digits") (10,hword_part,"Hyphenated word part, all letters") (11,hword_asciipart,"Hyphenated word part, all ASCII") (12,blank,"Space symbols") (13,tag,"XML tag") (14,protocol,"Protocol head") (15,numhword,"Hyphenated word, letters and digits") (16,asciihword,"Hyphenated word, all ASCII") (17,hword,"Hyphenated word, all letters") (18,url_path,"URL path") (19,file,"File or path name") (20,float,"Decimal notation") (21,int,"Signed integer") (22,uint,"Unsigned integer") (23,entity,"XML entity")(23 rows) ts_stat(sqlquery text, [ weights text, ] OUT word text, OUT ndoc integer, OUT nentry integer) 描述:获取tsvector列的统计数据。 返回类型:setof record 示例: 123456 gaussdb=# SELECT ts_stat('select ''hello world''::tsvector'); ts_stat ------------- (world,1,1) (hello,1,1)(2 rows)
  • 几何函数 area(object) 描述:计算图形的面积。 返回类型:double precision 示例: 12345 gaussdb=# SELECT area(box '((0,0),(1,1))') AS RESULT; result -------- 1(1 row) center(object) 描述:计算图形的中心。 返回类型:point 示例: 12345 gaussdb=# SELECT center(box '((0,0),(1,2))') AS RESULT; result --------- (0.5,1)(1 row) diameter(circle) 描述:计算圆的直径。 返回类型:double precision 示例: 12345 gaussdb=# SELECT diameter(circle '((0,0),2.0)') AS RESULT; result -------- 4(1 row) height(box) 描述:矩形的竖直高度。 返回类型:double precision 示例: 12345 gaussdb=# SELECT height(box '((0,0),(1,1))') AS RESULT; result -------- 1(1 row) isclosed(path) 描述:图形是否为闭合路径。 返回类型:Boolean 示例: 12345 gaussdb=# SELECT isclosed(path '((0,0),(1,1),(2,0))') AS RESULT; result -------- t(1 row) isopen(path) 描述:图形是否为开放路径。 返回类型:Boolean 示例: 12345 gaussdb=# SELECT isopen(path '[(0,0),(1,1),(2,0)]') AS RESULT; result -------- t(1 row) length(object) 描述:计算图形的长度。 返回类型:double precision 示例: 12345 gaussdb=# SELECT length(path '((-1,0),(1,0))') AS RESULT; result -------- 4(1 row) npoints(path) 描述:计算路径的顶点数。 返回类型:int 示例: 12345 gaussdb=# SELECT npoints(path '[(0,0),(1,1),(2,0)]') AS RESULT; result -------- 3(1 row) npoints(polygon) 描述:计算多边形的顶点数。 返回类型:int 示例: 12345 gaussdb=# SELECT npoints(polygon '((1,1),(0,0))') AS RESULT; result -------- 2(1 row) pclose(path) 描述:把路径转换为闭合路径。 返回类型:path 示例: 12345 gaussdb=# SELECT pclose(path '[(0,0),(1,1),(2,0)]') AS RESULT; result --------------------- ((0,0),(1,1),(2,0))(1 row) popen(path) 描述:把路径转换为开放路径。 返回类型:path 示例: 12345 gaussdb=# SELECT popen(path '((0,0),(1,1),(2,0))') AS RESULT; result --------------------- [(0,0),(1,1),(2,0)](1 row) radius(circle) 描述:计算圆的半径。 返回类型:double precision 示例: 12345 gaussdb=# SELECT radius(circle '((0,0),2.0)') AS RESULT; result -------- 2(1 row) width(box) 描述:计算矩形的水平尺寸。 返回类型:double precision 示例: 12345 gaussdb=# SELECT width(box '((0,0),(1,1))') AS RESULT; result -------- 1(1 row)
  • macaddr函数 函数trunc(macaddr)返回一个MAC地址,该地址的最后三个字节设置为零。 trunc(macaddr) 描述:把后三个字节置为零。 返回类型:macaddr 示例: 12345 gaussdb=# SELECT trunc(macaddr '12:34:56:78:90:ab') AS RESULT; result ------------------- 12:34:56:00:00:00(1 row)
  • cidr和inet函数 函数abbrev,host,text主要是为了提供可选的显示格式。 abbrev(inet) 描述:缩写显示格式文本。 返回类型:text 示例: 12345 gaussdb=# SELECT abbrev(inet '10.1.0.0/16') AS RESULT; result ------------- 10.1.0.0/16(1 row) abbrev(cidr) 描述:缩写显示格式文本。 返回类型:text 示例: 12345 gaussdb=# SELECT abbrev(cidr '10.1.0.0/16') AS RESULT; result --------- 10.1/16(1 row) broadcast(inet) 描述:网络广播地址。 返回类型:inet 示例: 12345 gaussdb=# SELECT broadcast('192.168.1.5/24') AS RESULT; result ------------------ 192.168.1.255/24(1 row) family(inet) 描述:抽取地址族,4为IPv4。 返回类型:int 示例: 12345 gaussdb=# SELECT family('127.0.0.1') AS RESULT; result -------- 4(1 row) host(inet) 描述:将主机地址类型抽出为文本。 返回类型:text 示例: 12345 gaussdb=# SELECT host('192.168.1.5/24') AS RESULT; result ------------- 192.168.1.5(1 row) hostmask(inet) 描述:为网络构造主机掩码。 返回类型:inet 示例: 12345 gaussdb=# SELECT hostmask('192.168.23.20/30') AS RESULT; result --------- 0.0.0.3(1 row) masklen(inet) 描述:抽取子网掩码长度。 返回类型:int 示例: 12345 gaussdb=# SELECT masklen('192.168.1.5/24') AS RESULT; result -------- 24(1 row) netmask(inet) 描述:为网络构造子网掩码。 返回类型:inet 示例: 12345 gaussdb=# SELECT netmask('192.168.1.5/24') AS RESULT; result --------------- 255.255.255.0(1 row) network(inet) 描述:抽取地址的网络部分。 返回类型:cidr 示例: 12345 gaussdb=# SELECT network('192.168.1.5/24') AS RESULT; result ---------------- 192.168.1.0/24(1 row) set_masklen(inet, int) 描述:为inet数值设置子网掩码长度。 返回类型:inet 示例: 12345 gaussdb=# SELECT set_masklen('192.168.1.5/24', 16) AS RESULT; result ---------------- 192.168.1.5/16(1 row) set_masklen(cidr, int) 描述:为cidr数值设置子网掩码长度。 返回类型:cidr 示例: 12345 gaussdb=# SELECT set_masklen('192.168.1.0/24'::cidr, 16) AS RESULT; result ---------------- 192.168.0.0/16(1 row) text(inet) 描述:把IP地址和掩码长度抽取为文本。 返回类型:text 示例: 12345 gaussdb=# SELECT text(inet '192.168.1.5') AS RESULT; result ---------------- 192.168.1.5/32(1 row)
  • 时间段输入 reltime的输入方式可以采用任何合法的时间段文本格式,包括数字形式(含负数和小数)及时间形式,其中时间形式的输入支持SQL标准格式、ISO-8601格式、POSTGRES格式等。另外,文本输入需要加单引号。 时间段输入的详细信息请参考表6 时间段输入。 表6 时间段输入 输入示例 输出结果 描述 60 2 mons 采用数字表示时间段,默认单位是day,可以是小数或负数。特别的,负数时间段,在语义上,可以理解为“早于多久”。 31.25 1 mons 1 days 06:00:00 -365 -12 mons -5 days 1 years 1 mons 8 days 12:00:00 1 years 1 mons 8 days 12:00:00 采用POSTGRES格式表示时间段,可以正负混用,不区分大小写,输出结果为将输入时间段计算并转换得到的简化POSTGRES格式时间段。 -13 months -10 hours -1 years -25 days -04:00:00 -2 YEARS +5 MONTHS 10 DAYS -1 years -6 mons -25 days -06:00:00 P-1.1Y10M -3 mons -5 days -06:00:00 采用ISO-8601格式表示时间段,可以正负混用,不区分大小写,输出结果为将输入时间段计算并转换得到的简化POSTGRES格式时间段。 -12H -12:00:00 示例: 1 2 3 4 5 6 7 8 910111213141516171819202122232425 --创建表。gaussdb=# CREATE TABLE reltime_type_tab(col1 character(30), col2 reltime);--插入数据。gaussdb=# INSERT INTO reltime_type_tab VALUES ('90', '90');gaussdb=# INSERT INTO reltime_type_tab VALUES ('-366', '-366');gaussdb=# INSERT INTO reltime_type_tab VALUES ('1975.25', '1975.25');gaussdb=# INSERT INTO reltime_type_tab VALUES ('-2 YEARS +5 MONTHS 10 DAYS', '-2 YEARS +5 MONTHS 10 DAYS');gaussdb=# INSERT INTO reltime_type_tab VALUES ('30 DAYS 12:00:00', '30 DAYS 12:00:00');gaussdb=# INSERT INTO reltime_type_tab VALUES ('P-1.1Y10M', 'P-1.1Y10M');--查看数据。gaussdb=# SELECT * FROM reltime_type_tab; col1 | col2 --------------------------------+------------------------------------- 1975.25 | 5 years 4 mons 29 days -2 YEARS +5 MONTHS 10 DAYS | -1 years -6 mons -25 days -06:00:00 P-1.1Y10M | -3 mons -5 days -06:00:00 -366 | -1 years -18:00:00 90 | 3 mons 30 DAYS 12:00:00 | 1 mon 12:00:00(6 rows)--删除表。gaussdb=# DROP TABLE reltime_type_tab;
  • 日期输入 日期和时间的输入几乎可以是任何合理的格式,包括ISO-8601格式、SQL-兼容格式、传统POSTGRES格式或者其它的形式。系统支持按照日、月、年的顺序自定义日期输入。如果把DateStyle参数设置为MDY就按照“月-日-年”解析,设置为DMY就按照“日-月-年”解析,设置为YMD就按照“年-月-日”解析。 日期的文本输入需要加单引号包围,语法如下: type [ ( p ) ] 'value' 可选的精度声明中的p是一个整数,表示在秒域中小数部分的位数。表2显示了date类型的输入方式。 表2 日期输入方式 例子 描述 1999-01-08 ISO 8601格式(建议格式),任何方式下都是1999年1月8号。 January 8, 1999 在任何datestyle输入模式下都无歧义。 1/8/1999 有歧义,在MDY模式下是一月八号,在DMY模式下是八月一号。 1/18/1999 MDY模式下是一月十八日,其它模式下被拒绝。 01/02/03 MDY模式下的2003年1月2日。 DMY模式下的2003年2月1日。 YMD模式下的2001年2月3日。 1999-Jan-08 任何模式下都是1月8日。 Jan-08-1999 任何模式下都是1月8日。 08-Jan-1999 任何模式下都是1月8日。 99-Jan-08 YMD模式下是1月8日,否则错误。 08-Jan-99 一月八日,除了在YMD模式下是错误的之外。 Jan-08-99 一月八日,除了在YMD模式下是错误的之外。 19990108 ISO 8601;任何模式下都是1999年1月8日。 990108 ISO 8601;任何模式下都是1999年1月8日。 1999.008 年和年里的第几天。 J2451187 儒略日。 January 8, 99 BC 公元前99年。 示例: 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637 --创建表。gaussdb=# CREATE TABLE date_type_tab(coll date);--插入数据。gaussdb=# INSERT INTO date_type_tab VALUES (date '12-10-2010');--查看数据。gaussdb=# SELECT * FROM date_type_tab; coll --------------------- 2010-12-10(1 row)--查看日期格式。gaussdb=# SHOW datestyle; DateStyle ----------- ISO, MDY(1 row)--设置日期格式。gaussdb=# SET datestyle='YMD';SET--插入数据。gaussdb=# INSERT INTO date_type_tab VALUES(date '2010-12-11');--查看数据。gaussdb=# SELECT * FROM date_type_tab; coll --------------------- 2010-12-10 2010-12-11(2 rows)--删除表。gaussdb=# DROP TABLE date_type_tab;
  • 模式匹配操作符 数据库提供了三种独立的实现模式匹配的方法:SQL LIKE操作符、SIMILAR TO操作符和POSIX-风格的正则表达式。除了这些基本的操作符外,还有一些函数可用于提取或替换匹配子串并在匹配位置分离一个串。 LIKE 描述:判断字符串是否能匹配上LIKE后的模式字符串。如果字符串与提供的模式匹配,则LIKE表达式返回为真(NOT LIKE表达式返回假),否则返回为假(NOT LIKE表达式返回真)。 匹配规则: 此操作符只有在它的模式匹配整个串的时候才能成功。如果要匹配在串内任何位置的序列,该模式必须以百分号开头和结尾。 下划线 (_)代表(匹配)任何单个字符; 百分号(%)代表任意串的通配符。 要匹配文本里的下划线或者百分号,在提供的模式里相应字符必须前导逃逸字符。逃逸字符的作用是禁用元字符的特殊含义,缺省的逃逸字符是反斜线,也可以用ESCAPE子句指定一个不同的逃逸字符。 要匹配逃逸字符本身,写两个逃逸字符。例如要写一个包含反斜线的模式常量,需要在SQL语句里写两个反斜线。 参数standard_conforming_strings设置为off时,在文串常量中写的任何反斜线都需要被双写。因此,写一个匹配单个反斜线的模式实际上要在语句里写四个反斜线(你可以通过用ESCAPE选择一个不同的逃逸字符来避免这种情况,这样反斜线就不再是LIKE的特殊字符了。但仍然是字符文本分析器的特殊字符,所以你还是需要两个反斜线)。 在兼容MYSQL数据模式时,您也可以通过写ESCAPE ''的方式不选择逃逸字符,这样可以有效地禁用逃逸机制,但是没有办法关闭下划线和百分号在模式中的特殊含义。 关键字ILIKE可以用于替换LIKE,区别是LIKE大小写敏感,ILIKE大小写不敏感。 操作符~~等效于LIKE,操作符~~*等效于ILIKE。 示例: 12345 gaussdb=# SELECT 'abc' LIKE 'abc' AS RESULT; result----------- t(1 row) 12345 gaussdb=# SELECT 'abc' LIKE 'a%' AS RESULT; result----------- t(1 row) 12345 gaussdb=# SELECT 'abc' LIKE '_b_' AS RESULT; result----------- t(1 row) 12345 gaussdb=# SELECT 'abc' LIKE 'c' AS RESULT; result----------- f(1 row) SIMILAR TO 描述:SIMILAR TO操作符根据自己的模式是否匹配给定串而返回真或者假。他和LIKE非常类似,只不过他使用SQL标准定义的正则表达式理解模式。 匹配规则: 和LIKE一样,此操作符只有在它的模式匹配整个串的时候才能成功。如果要匹配在串内任何位置的序列,该模式必须以百分号开头和结尾。 下划线 (_)代表(匹配)任何单个字符; 百分号(%)代表任意串的通配符。 SIMILAR TO也支持下面这些从POSIX正则表达式借用的模式匹配元字符。 元字符 含义 | 表示选择(两个候选之一) * 表示重复前面的项零次或更多次 + 表示重复前面的项一次或更多次 ? 表示重复前面的项零次或一次 {m} 表示重复前面的项刚好m次 {m,} 表示重复前面的项m次或更多次 {m,n} 表示重复前面的项至少m次并且不超过n次 () 把多个项组合成一个逻辑项 [...] 声明一个字符类,就像POSIX正则表达式一样 前导逃逸字符可以禁止所有这些元字符的特殊含义。逃逸字符的使用规则和LIKE一样。 正则表达式函数: 支持使用函数substring(string from pa...截取匹配SQL正则表达式的子字符串。 示例: 12345 gaussdb=# SELECT 'abc' SIMILAR TO 'abc' AS RESULT; result----------- t(1 row) 12345 gaussdb=# SELECT 'abc' SIMILAR TO 'a' AS RESULT; result----------- f(1 row) 12345 gaussdb=# SELECT 'abc' SIMILAR TO '%(b|d)%' AS RESULT; result----------- t(1 row) 12345 gaussdb=# SELECT 'abc' SIMILAR TO '(b|c)%' AS RESULT; result----------- f(1 row) POSIX正则表达式 描述:正则表达式是一个字符序列,它是定义一个串集合(一个正则集)的缩写。 如果一个串是正则表达式描述的正则集中的一员时, 我们就说这个串匹配该正则表达式。 POSIX正则表达式提供了比LIKE和SIMILAR TO操作符更强大的含义。表1列出了所有可用于POSIX正则表达式模式匹配的操作符。 表1 正则表达式匹配操作符 操作符 描述 例子 ~ 匹配正则表达式,大小写敏感 'thomas' ~ '.*thomas.*' ~* 匹配正则表达式,大小写不敏感 'thomas' ~* '.*Thomas.*' !~ 不匹配正则表达式,大小写敏感 'thomas' !~ '.*Thomas.*' !~* 不匹配正则表达式,大小写不敏感 'thomas' !~* '.*vadim.*' 匹配规则: 与LIKE不同,正则表达式允许匹配串里的任何位置,除非该正则表达式显式地挂接在串的开头或者结尾。 除了上文提到的元字符外, POSIX正则表达式还支持下列模式匹配元字符。 元字符 含义 ^ 表示串开头的匹配 $ 表示串末尾的匹配 . 匹配任意单个字符 正则表达式函数: POSIX正则表达式支持下面函数。 substring(string from pa...函数提供了抽取一个匹配POSIX正则表达式模式的子串的方法。 •regexp_count(string tex...函数提供了获取匹配POSIX正则表达式模式的子串数量的功能。 •regexp_instr(string tex...函数提供了获取匹配POSIX正则表达式模式子串位置的功能。 •regexp_substr(string te...函数提供了抽取一个匹配POSIX正则表达式模式的子串的方法。 regexp_replace(string, p...函数提供了将匹配POSIX正则表达式模式的子串替换为新文本的功能。 regexp_matches(string te...函数返回一个文本数组,该数组由匹配一个POSIX正则表达式模式得到的所有被捕获子串构成。 regexp_split_to_table(st...函数把一个POSIX正则表达式模式当作一个定界符来分离一个串。 regexp_split_to_array(st...和regexp_split_to_table类似,是一个正则表达式分离函数,不过它的结果以一个text数组的形式返回。 正则表达式分离函数会忽略零长度的匹配,这种匹配发生在串的开头或结尾或者正好发生在前一个匹配之后。这和正则表达式匹配的严格定义是相悖的,后者由regexp_matches实现,但是通常前者是实际中最常用的行为。 示例: 12345 gaussdb=# SELECT 'abc' ~ 'Abc' AS RESULT;result -------- f(1 row) 12345 gaussdb=# SELECT 'abc' ~* 'Abc' AS RESULT; result -------- t(1 row) 12345 gaussdb=# SELECT 'abc' !~ 'Abc' AS RESULT; result -------- t(1 row) 12345 gaussdb=# SELECT 'abc'!~* 'Abc' AS RESULT; result -------- f(1 row) 12345 gaussdb=# SELECT 'abc' ~ '^a' AS RESULT; result -------- t(1 row) 12345 gaussdb=# SELECT 'abc' ~ '(b|d)'AS RESULT; result -------- t(1 row) 12345 gaussdb=# SELECT 'abc' ~ '^(b|c)'AS RESULT; result -------- f(1 row) 虽然大部分的正则表达式搜索都能很快地执行,但是仍可能被人为地处理成需要任意长的时间和任意量的内存。不建议从非安全模式来源接受正则表达式搜索模式,如果必须这样做,建议加上语句超时限制。使用SIMILAR TO模式的搜索具有同样的安全性危险, 因为SIMILAR TO提供了很多和POSIX-风格正则表达式相同的能力。LIKE搜索比其他两种选项简单得多,因此在接受非安全模式来源搜索时要更安全些。 父主题: 函数和操作符
  • 二进制字符串函数 GaussDB Kernel也提供了函数调用所使用的常用语法。 btrim(string bytea,bytes bytea) 描述:从string的开头和结尾删除只包含bytes中字节的最长的字符串。 返回值类型:bytea 示例: 12345 gaussdb=# SELECT btrim(E'\\000trim\\000'::bytea, E'\\000'::bytea) AS RESULT; result ------------ \x7472696d(1 row) get_bit(string, offset) 描述:从字符串中抽取位。 返回值类型:int 示例: 12345 gaussdb=# SELECT get_bit(E'Th\\000omas'::bytea, 45) AS RESULT; result-------- 1(1 row) get_byte(string, offset) 描述:从字符串中抽取字节。 返回值类型:int 示例: 12345 gaussdb=# SELECT get_byte(E'Th\\000omas'::bytea, 4) AS RESULT; result-------- 109(1 row) rawcmp 描述:raw数据类型比较函数。 参数:raw, raw 返回值类型:integer raweq 描述:raw数据类型比较函数。 参数:raw, raw 返回值类型:boolean rawge 描述:raw数据类型比较函数。 参数:raw, raw 返回值类型:boolean rawgt 描述:raw数据类型比较函数。 参数:raw, raw 返回值类型:boolean rawin 描述:raw数据类型解析函数。 参数:cstring 返回值类型:bytea rawle 描述:raw数据类型解析函数。 参数:raw, raw 返回值类型:boolean rawlike 描述:raw数据类型解析函数。 参数:raw, raw 返回值类型:boolean rawlt 描述:raw数据类型解析函数。 参数:raw, raw 返回值类型:boolean rawne 描述:比较raw类型是否一样。 参数:raw, raw 返回值类型:boolean rawnlike 描述:比较raw类型与模式是否不匹配。 参数:raw, raw 返回值类型:boolean rawout 描述:RAW类型的输出接口。 参数:bytea 返回值类型:cstring rawsend 描述:转换bytea为二进制类型。 参数:raw 返回值类型:bytea rawtohex 描述:raw格式转换为十六进制。 参数:text 返回值类型:text set_bit(string,offset, newvalue) 描述:设置字符串中的位。 返回值类型:bytea 示例: 12345 gaussdb=# SELECT set_bit(E'Th\\000omas'::bytea, 45, 0) AS RESULT; result ------------------ \x5468006f6d4173(1 row) set_byte(string,offset, newvalue) 描述:设置字符串中的字节。 返回值类型:bytea 示例: 12345 gaussdb=# SELECT set_byte(E'Th\\000omas'::bytea, 4, 64) AS RESULT; result ------------------ \x5468006f406173(1 row)
  • 字符串操作符 SQL定义了一些字符串函数,在这些函数里使用关键字而不是逗号来分隔参数。 octet_length(string) 描述:二进制字符串中的字节数。 返回值类型:int 示例: 12345 gaussdb=# SELECT octet_length(E'jo\\000se'::bytea) AS RESULT; result-------- 5(1 row) overlay(string placing string from int [for int]) 描述:替换子串。 返回值类型:bytea 示例: 12345 gaussdb=# SELECT overlay(E'Th\\000omas'::bytea placing E'\\002\\003'::bytea from 2 for 3) AS RESULT; result ---------------- \x5402036d6173(1 row) position(substring in string) 描述:特定子字符串的位置。 返回值类型:int 示例: 12345 gaussdb=# SELECT position(E'\\000om'::bytea in E'Th\\000omas'::bytea) AS RESULT; result-------- 3(1 row) substring(string [from int] [for int]) 描述:截取子串。 返回值类型:bytea 示例: 12345 gaussdb=# SELECT substring(E'Th\\000omas'::bytea from 2 for 3) AS RESULT; result ---------- \x68006f(1 row) substr(string, from int [, for int]) 描述:截取子串。 返回值类型:bytea 示例: 12345 gaussdb=# select substr(E'Th\\000omas'::bytea,2, 3) as result; result---------- \x68006f(1 row) trim([both] bytes from string) 描述:从string的开头和结尾删除只包含bytes中字节的最长字符串。 返回值类型:bytea 示例: 12345 gaussdb=# SELECT trim(E'\\000'::bytea from E'\\000Tom\\000'::bytea) AS RESULT; result ---------- \x546f6d(1 row)
  • 常量与宏 GaussDB Kernel支持的常量和宏请参见表1。 表1 常量和宏 参数 描述 示例 CURRENT_CATA LOG 当前数据库 12345 gaussdb=# SELECT CURRENT_CATALOG;current_database------------------testdb(1 row) CURRENT_ROLE 当前用户 12345 gaussdb=# SELECT CURRENT_ROLE;current_user--------------omm(1 row) CURRENT_SCHEMA 当前数据库模式 12345 gaussdb=# SELECT CURRENT_SCHEMA;current_schema----------------public(1 row) CURRENT_USER 当前用户 12345 gaussdb=# SELECT CURRENT_USER;current_user--------------omm(1 row) LOCALTIMESTAMP 当前会话时间(无时区) 12345 gaussdb=# SELECT LOCALTIMESTAMP; timestamp----------------------------2015-10-10 15:37:30.968538(1 row) NULL 空值 - SESSION_USER 当前系统用户 12345 gaussdb=# SELECT SESSION_USER;session_user--------------omm(1 row) SYSDATE 当前系统日期 12345 gaussdb=# SELECT SYSDATE;sysdate---------------------2015-10-10 15:48:53(1 row) USER 当前用户,此用户为CURRENT_USER的别名。 12345 gaussdb=# SELECT USER;current_user--------------omm(1 row) 父主题: SQL参考
  • 列存表支持的数据类型 列存表支持的数据类型如表1所示。 表1 列存表支持的数据类型 类别 数据类型 长度 是否支持 Numeric Types smallint 2 支持 integer 4 支持 bigint 8 支持 decimal -1 支持 numeric -1 支持 real 4 支持 double precision 8 支持 smallserial 2 支持 serial 4 支持 bigserial 8 支持 largeserial -1 支持 Monetary Types money 8 支持 Character Types character varying(n), varchar(n) -1 支持 character(n), char(n) n 支持 character、char 1 支持 text -1 支持 nvarchar -1 支持 nvarchar2 -1 支持 name 64 不支持 Date/Time Types timestamp with time zone 8 支持 timestamp without time zone 8 支持 date 4 支持 time without time zone 8 支持 time with time zone 12 支持 interval 16 支持 big object clob -1 支持 blob -1 不支持 XML Types xml -1 支持 other types … … 不支持 父主题: 数据类型
  • 注意事项 SET类型的表字段值必须是SET类型定义的集合的子集。如: CREATE TABLE employee ( name text, site SET('beijing','shanghai','nanjing','wuhan')); site字段的值必须是上述集合定义中的子集,可以是空集合,如果提供的值在SET定义中的成员中不存在,会报错。如: gaussdb=# INSERT INTO employee values('zhangsan', 'nanjing,beijing');INSERT 0 1gaussdb=# insert into employee values ('zhangsan', 'hangzhou');ERROR: invalid input value for set employee_site_set: 'hangzhou'LINE 1: insert into employee values ('zhangsan', 'hangzhou'); ^CONTEXT: referenced column: site INSERT时无论用户提供的成员值顺序是怎样的,INSERT成功后,查询到的SET类型的值,其成员的都是按照定义时的顺序输出的。 gaussdb=# select * from employee; name | site ----------+----------------- zhangsan | beijing,nanjing(1 rows) SET类型是以bitmap的方式存储的。SET类型的成员按照定义时的顺序,赋予不同的值。如:SET('beijing','shanghai','nanjing','wuhan') 的类型,对应的值如下: 表1 SET成员与其对应的数值 SET成员 成员值 二进制值 'beijing' 1 0001 'shanghai' 2 0010 'nanjing' 4 0100 'wuhan' 8 1000 因此,如果给SET类型的字段赋值为数值时,会转换为对应的子集。如:9对应的二进制值为 1001, 对应的是子集是 'beijing,wuhan'。 gaussdb=# INSERT INTO employee values('lisi', 9);INSERT 0 1gaussdb=# select * from employee; name | site ----------+----------------- zhangsan | beijing,nanjing lisi | beijing,wuhan(2 rows)
  • 函数和操作符 当GUC参数behavior_compat_options含有'enable_funcname_with_argsname'选项时,投影别名显示完整函数。 逻辑操作符 比较操作符 字符处理函数和操作符 二进制字符串函数和操作符 位串函数和操作符 模式匹配操作符 数字操作函数和操作符 时间和日期处理函数和操作符 类型转换函数 几何函数和操作符 网络地址函数和操作符 文本检索函数和操作符 JSON/JSONB函数和操作符 HLL函数和操作符 SEQUENCE函数 数组函数和操作符 范围函数和操作符 聚集函数 窗口函数 安全函数 账本数据库的函数 密态函数和操作符 返回集合的函数 条件表达式函数 系统信息函数 系统管理函数 统计信息函数 触发器函数 HashFunc函数 提示信息函数 全局临时表函数 故障注入系统函数 AI特性函数 动态数据脱敏函数 层次递归查询函数 其他系统函数 内部函数 Global SysCache特性函数 数据损坏检测修复函数 XML类型函数 XMLTYPE类型函数 Global Plsql Cache特性函数 废弃函数 父主题: SQL参考
  • aclitem类型 aclitem数据类型是用来存储对象权限信息的,它的内部实现是int类型,支持的格式为‘user1=privs/user2’。 aclitem[]数据类型为aclitem组成的数组,支持的格式为‘{user1=privs1/user3,user2=privs2/user3}’。 其中user1,user2和user3为数据库中已存在的用户/角色名,privs为数据库中支持的权限(参见表2)。 示例: gaussdb=# create table table_acl (id int,priv aclitem,privs aclitem[]);--新建一张数据表table_acl,有三个字段,类型分别为int,aclitem,aclitem[]gaussdb=# insert into table_acl values (1,'user1=arw/omm','{omm=d/user2,omm=w/omm}');--向数据表table_acl插入一条内容为(1,'user1=arw/omm','{omm=d/user2,omm=w/omm}')的数据gaussdb=# insert into table_acl values (2,'user1=aw/omm','{omm=d/user2}');--向数据表table_acl再插入一条内容为(2,'user1=aw/omm','{omm=d/user2}')的数据gaussdb=# select * from table_acl; id | priv | privs----+---------------+------------------------- 1 | user1=arw/omm | {omm=d/user2,omm=w/omm} 2 | user1=aw/omm | {omm=d/user2}(2 rows) 父主题: 数据类型
共100000条