金仓数据库 KingbaseES SQL 语言参考手册 (8. 函数(四))

8.102. DATE_PART

用法:

date_part(text,timestamp)
date_part(text, interval)

功能:

获取子域,date_part函数等价于SQL标准函数extract

例子:

SELECT date_part('hour', timestamp '2001-02-16 20:38:40');
SELECT date_part('month', interval '2 years 3 months');

8.103. DATE_TRUNC

用法:

date_trunc(field, source [, time_zone ])

功能:

date_trunc函数在概念上和用于数字的trunc函数类似。 ``source``是类型timestamptimestamp with time zoneinterval的 值表达式(类型date和 time的值都分别被自动转换成 timestamp或者interval)。``field`` 选择对输入值选用什么样的精度进行截断。返回值的类型类似于timestamptimestamp with time zone, 或interval,并且所有小于选定的精度的域都设置为零(或者一,对于日期和月份)。

``field``的有效值是∶

microseconds

milliseconds

second

minute

hour

day

week

month

quarter

year

decade

century

millennium

当输入值的类型timestamp with time zone时,对特定时区进行截断;例如,将其截断为day将生成该区域的午夜值。默认情况下,截断是当前 TimeZone 设置, 但可选 ``time_zone``提供参数来指定不同的时区。时区名称可以用 时区 中描述的任何一种方式指定。

在处理时间戳时,如果timestamp without time zoneinterval输入,则无法指定时区。这些都是表面的价值。

例子:

SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
SELECT date_trunc('day', TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40+00');
SELECT date_trunc('hour', INTERVAL '3 days 02:47:33');

8.104. DAYS_BETWEEN

用法:

days_between(date1,date2)

功能:

返回date1和date2两个日期之间的天数

例子:

SELECT days_between('2020-01-01','2021-01-01');

8.105. DECODE

用法:

decode(expr,search,result,[search,result, ...] default)

功能:

DECODE逐个将expr与每个搜索值(search)进行比较。如果expr等于搜索值(search),则KingbaseES数据库返回相应的结果(result)。如果找不到匹配项,则将返回默认值(default)。如果省略默认值,则返回空值(NULL)。

参数可以是任何类型。 如果expr和search是字符数据,那么KingbaseES使用非添加的比较语义对它们进行比较。返回的字符串是VARCHAR数据类型,与第一个结果参数在同一个字符集中。

如果第一个搜索结果对是数字,则KingbaseES将比较所有搜索结果表达式和第一个用于确定具有最高数字优先级的参数的表达式,隐式将其余参数转换为该数据类型,并返回该数据类型。 search、result和default可以从表达式派生。

KingbaseES数据库使用短路评估。数据库只在将每个search与expr进行比较之前对其求值,而不是在将所有search与expr进行比较之前对其求值。因此,如果前一个search等于expr,KingbaseES不再计算其它search、result。 KingbaseES自动将expr和每个search转换为比较前的第一个search。

KingbaseES自动转换返回值与第一个结果相同的数据类型。如果第一个结果具有数据类型CHAR或者如果第一个结果为空,则KingbaseES将返回值转换为数据类型VARCHAR。

在DECODE函数中,KingbaseES认为两个空值相等。DECODE函数中的最大参数个数(包括expr、search、result和default)为255个。

例子:

SELECT decode(NULL,1,3,NULL,4);

8.106. DECODING

用法:

decoding(string text,format text)

功能:

从 string 中的文本表达解码二进制数据。format 的选项和 encode 中的一样。

例子:

SELECT decoding('MTIzAAE=','base64');

8.107. DEGREES

用法:

degrees(dp)

功能:

数学函数,把弧度转化为角度

例子:

SELECT degrees(0.5);

8.108. DELETEXML

用法:

deletexml(xml_instance xml, xpath text)
deletexml(xml_instance xml, xpath text, namespace _text)

功能:

函数deletexml会删除``xml_instance``实例中与``xpath``表达式匹配的节点。

每次删除指定的一层节点,若一层含有多个节点,则该层所有节点都将被删除。若删除节点后父节点值为空,则父节点只显示结尾部分,否则显示完整父节点及父节点的其他值。

此函数使用前需要创建kdb_utils_function扩展。

例子:

删除一层多个节点

SELECT deletexml('<test>'<value>oldnode'</value>'<value>oldnode'</value>'</test>','/test/value');

删除的节点值为空

SELECT deletexml('<a><b></b><b></b></a>', '//b');

删除指定节点后父节点值为空

SELECT deletexml('<test><value></value><value><t>11</t></value></test>','/test/value/t');

删除指定节点后,指定节点的父节点值不为空

SELECT deletexml('<test><value>12</value><value><t>12</t><b>12</b></value></test>', '/test/value/t');

8.109. DENSE_RANK

用法:

dense_rank()

功能:

通用窗口函数,返回不带间隙的当前行排名。

例子:

SELECT dense_rank(x) WITHIN GROUP (ORDER BY x) FROM (VALUES (1),(1),(2),(2),(3),(3)) v(x) GROUP BY (x) ORDER BY 1;

8.110. DIAMETER

用法:

diameter(circle)

功能:

几何函数 ,返回圆的直径。

例子:

SELECT diameter(circle '((0,0),2.0)');

8.111. DIV

用法:

div(y numeric, x numeric)

功能:

数学函数 ,返回 y 除以 x 的整数商。

例子:

SELECT div(9,4);

8.112. EMPTY_BLOB

用法:

empty_blob()

功能:

二进制函数,大对象函数 ,产生并返回一个新的 blob 对象。

例子:

SELECT empty_blob();

8.113. EMPTY_CLOB

用法:

empty_clob()

功能:

大对象函数 ,产生并返回一个新的 clob 对象。

例子:

SELECT empty_clob();

8.114. EMPTY_NCLOB

用法:

empty_nclob()

功能:

大对象函数 ,产生并返回一个新的 nclob 对象。

例子:

SELECT empty_nclob();

8.115. ENCODE

用法:

encode(data bytea,format text)

功能:

字符串函数 ,将二进制数据 data 编码成一个文本表达。 format 支持的格式有:base64 、 hex、escape。 escape 将零字节和高位组字节转换为八进制序列(nnn)和双写的反斜线

例子:

SELECT encode(’123000001’,’base64’);

8.116. ENUM_FIRST

用法:

enum_first(anyenum)

功能:

枚举函数 ,返回输入枚举类型的第一个值 。

例子:

SELECT enum_first(null::rainbow);

8.117. ENUM_LAST

用法:

enum_last(anyenum)

功能:

枚举函数 ,返回输入枚举类型的最后一个值 。

例子:

SELECT enum_last(null::rainbow);

8.118. ENUM_RANGE

用法:

enum_range(anyenum)
enum_range(anyenum, anyenum)

功能:

枚举函数 ,输入一个枚举参数时,将输入枚举类型的所有值作为一个有序的数组返回。 输入两个参数时,以一个数组返回在给定两个枚举值之间的范围。值必须来自相同的枚举类型。如果第一个参数为空,其结果将从枚举类型的第一个值开始。如果第二参数为空,其结果将以枚举类型的最后一个值结束。

例子:

SELECT enum_range(null::rainbow);
SELECT enum_range('orange'::rainbow,'green'::rainbow);

8.119. EVERY

用法:

every(expression)

功能:

等价于bool_and

例子:

SELECT every(boolcol) FROM table;

8.120. EXISTSNODE

用法:

existsnode(text PASSING [BY { REF | VALUE }] xml [BY { REF | VALUE }])
existsnode(xml_instance xml, xpath text)

功能:

XML函数existsnode会遍历``xml``实例,判断指定节点是否存在于实例中。若存在则返回1,不存在则返回0。

此函数使用前需要创建kdb_utils_function扩展。

例子:

SELECT existsnode('//town[text() = ''Toronto'']' PASSING BY REF '<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>');
SELECT existsnode('//town[text() = ''Cwmbran'']' PASSING BY REF '<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>');
SELECT existsnode('<a><b>d</b></a>', '/a/b');

8.121. EXP

用法:

exp({dp|numeric})

功能:

数学函数,返回输入参数的指数。

例子:

SELECT exp(1.0);

8.122. EXTRACT

用法:

EXTRACT(field FROM source)
extract(xml_instance xml, xpath text)

功能:

  • 时间函数

    extract函数从日期/时间值中抽取子域,例如年或者小时等。``source``必须是一个类型 timestamptimeinterval的值表达式(类型为date的表达式将被造型为 timestamp,并且因此也可以被同样使用)。``field``是一个标识符或者字符串,它指定从源值中抽取的域。extract函数返回类型为double precision的值。 下列值是有效的域名字∶

    century

    世纪

    SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13');
    结果:20
    SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40');
    结果:21

    第一个世纪从 0001-01-01 00:00:00 AD 开始, 尽管那时候人们还不知道这是第一个世纪。这个定义适用于所有使用格里高利历法的国家。其中没有 0 世纪,我们直接从公元前 1 世纪到公元 1 世纪。 如果你认为这个不合理,那么请把抱怨发给:罗马圣彼得教堂,梵蒂冈,教皇收。

    day

    对于timestamp值,是(月份)里的日域(1-31);对于interval值,是日数

    SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
    结果:16
    
    SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute');
    结果:40

    decade

    年份域除以10

    SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
    结果:200

    dow

    一周中的日,从周日(0)到周六(6

    SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
    结果:5

    请注意,extract的一周中的日和to_char(..., 'D')函数不同。

    doy

    一年的第几天(1 -365/366)

    SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40');
    结果:47

    epoch

    对于timestamp with time zone值, 是自 1970-01-01 00:00:00 UTC 以来的秒数(结果可能是负数); 对于date and timestamp值,是自本地时间 1970-01-01 00:00:00 以来的描述;对于interval值,它是时间间隔的总秒数。

    SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16
    20:38:40.12-08');
    结果:982384720.12
    
    SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
    结果:442800

    不能用to_timestamp把一个 epoch 值转换回成时间戳:

    SELECT to_timestamp(982384720.12);
    Result: 2001-02-17 04:38:40.12+00

    hour

    小时域(0 - 23)

    SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
    结果:20

    isodow

    一周中的日,从周一(1)到周日(7

    SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40');
    结果:7

    除了周日,这和dow相同。这符合ISO 8601 中一周中的日的编号。

    isoyear

    日期所落在的ISO 8601 周编号的年(不适用于间隔)

    SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01');
    结果:2005
    SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02');
    结果:2006

    每一个ISO 8601 周编号的年都开始于包含1月4日的那一周的周一,在早的1月或迟的12月中ISO年可能和格里高利年不同。更多信息见week域。

    这个域不能用于 KingbaseES V8.6 之前的版本。

    microseconds

    秒域,包括小数部分,乘以 1,000,000。请注意它包括全部的秒

    SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5');
    结果:28500000

    millennium

    千年

    SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40');
    结果:3

    19xx的年份在第二个千年里。第三个千年从 2001 年 1 月 1 日开始。

    milliseconds

    秒域,包括小数部分,乘以 1000。请注意它包括完整的秒。

    SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5');
    结果:28500

    minute

    分钟域(0 - 59)

    SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40');
    结果:38

    month

    对于timestamp值,它是一年里的月份数(1 - 12); 对于interval值,它是月的数目,然后对 12 取模(0 - 11)

    SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40');
    结果:2
    
    SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months');
    结果:3
    
    SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');
    结果:1

    quarter

    该天所在的该年的季度(1 - 4)

    SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');
    结果:1

    second

    秒域,包括小数部分(0 - 59 [1]_ )

    SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40');
    结果:40
    
    SELECT EXTRACT(SECOND FROM TIME '17:12:28.5');
    结果:28.5

    timezone

    与 UTC 的时区偏移,以秒记。正数对应 UTC 东边的时区,负数对应 UTC 西边的时区(从技术上来看,KingbaseES不使用 UTC,因为其中不处理闰秒)。

    timezone_hour

    时区偏移的小时部分。

    timezone_minute

    时区偏移的分钟部分。

    week

    该天在所在的ISO 8601 周编号的年份里是第几周。根据定义, 一年的第一周包含该年的 1月 4 日并且 ISO 周从星期一开始。换句话说,一年的第一个星期四在第一周。

    在 ISO 周编号系统中,早的 1 月的日期可能位于前一年的第五十二或者第五十三周,而迟的 12 月的日期可能位于下一年的第一周。例如, 2005-01-01位于 2004 年的第五十三周,并且2006-01-01位于 2005 年的第五十二周,而2012-12-31位于 2013 年的第一周。我们推荐把isoyear域和week一起使用来得到一致的结果。

    SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40');
    结果:7

    year

    年份域。要记住这里没有0 AD,所以从AD年里抽取BC年应该小心处理。

    SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40');
    结果:2001

    注意

    当输入值为 +/-Infinity 时,extract对于单调增的域(epochjulianyearisoyeardecadecentury以及millennium)返回 +/-Infinity。对于其他域返回 NULL。KingbaseES V8.2 之前的版本对所有输入无穷的情况都返回零。

    extract函数主要的用途是做计算性处理。对于用于显示的日期/时间值格式化,参阅 数据类型格式化函数 。

  • XML函数

    extract会返回``xpath``指定的节点的xml数据。此函数使用前需要创建kdb_utils_function扩展。

例子:

  • 处理时间时

    请参考功能说明里的例子。

  • 处理 XML时

    SELECT extract(xml('<行><ID>1</ID></行>'), '/行/ID');
    SELECT extract(xml('<行><ID>1</ID></行>'), '/行');
    SELECT extract(xml('<行 属性="测试属性"><ID>1</ID></行>'), '/行');
    SELECT extract(xml('<行 属性="测试属性"><ID>1</ID></行>'), '/行/@属性');

8.123. EXTRACTVALUE

用法:

extractvalue(xml_instance xml, xpath text)
extractvalue(xml_instance xml, xpath text, namespace _text)

功能:

函数extractvalue会返回``xpath``指定的节点的值。如果节点的值是另一个节点,则不可获取,若指定节点路径存在多个相同节点,则会报错,也可通过数组形式,如:'/a/b[1]'指定返回具体节点。

此函数使用前需要创建kdb_utils_function扩展。

例子:

SELECT extractvalue('<a><b>b</b></a>','/a/b');
SELECT extractvalue('<a xmlns="http://example.com"><b>test</b></a>', '//mydefns:b/text()',ARRAY[ARRAY['mydefns', 'http://example.com']]);
SELECT extractvalue('<a><b>b1</b><b>b2</b></a>','/a/b[2]');

8.124. FAMILY

用法:

family(inet)

功能:

返回 inet 指定的网络地址族类型,返回4为 IPV4 , 6为 IPV6。

例子:

SELECT family('::1');

8.125. FIRST_VALUE

用法:

first_value(value any)

功能:

返回在窗口帧中第一行上计算的 value 。只考虑“窗口帧”内的行,它默认情况下包含从分区的开始行直到当前行的最后一个同等行。

例子:

CREATE TEMP TABLE datetimes(
id int,
f_time time,
f_timetz timetz,
f_interval interval,
f_timestamptz timestamptz,
f_timestamp timestamp
);

INSERT INTO datetimes VALUES
(1, '11:00', '11:00 BST', '1 year', '2000-10-19 10:23:54+01', '2000-10-19 10:23:54'),
(2, '12:00', '12:00 BST', '2 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'),
(3, '13:00', '13:00 BST', '3 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'),
(4, '14:00', '14:00 BST', '4 years', '2002-10-19 10:23:54+01', '2002-10-19 10:23:54'),
(5, '15:00', '15:00 BST', '5 years', '2003-10-19 10:23:54+01', '2003-10-19 10:23:54'),
(6, '15:00', '15:00 BST', '5 years', '2004-10-19 10:23:54+01', '2004-10-19 10:23:54'),
(7, '17:00', '17:00 BST', '7 years', '2005-10-19 10:23:54+01', '2005-10-19 10:23:54'),
(8, '18:00', '18:00 BST', '8 years', '2006-10-19 10:23:54+01', '2006-10-19 10:23:54'),
(9, '19:00', '19:00 BST', '9 years', '2007-10-19 10:23:54+01', '2007-10-19 10:23:54'),
(10, '20:00', '20:00 BST', '10 years', '2008-10-19 10:23:54+01', '2008-10-19 10:23:54');

SELECT id, f_time, first_value(id) OVER w
FROM datetimes
WINDOW w AS (ORDER BY f_time RANGE BETWEEN
         '70 min'::interval preceding AND '2 hours'::interval following);

8.126. FLOOR

用法:

first_value(n)

功能:

FLOOR返回等于或小于n的最大整数。该数字n始终可以写为整数k和正分数之和f,使得 0 <= f< 1 和n= k+ f。的值FLOOR是整数k。因此,当且仅当的值恰好是一个整数n时,它的值FLOOR就是它本身。此函数将任何数值数据类型或任何可以隐式转换为数值数据类型的非数值数据类型作为参数。该函数返回与参数的数值数据类型相同的数据类型。

例子:

以下示例返回等于或小于 42.3 的最大整数

SELECT FLOOR(42.3);

8.127. FORMAT

用法:

format(formatstr text [, formatarg "any" [, ...] ])

功能:

函数format根据一个格式字符串产生格式化的输出,其形式类似于 C 函数sprintf。 ``formatstr``是一个格式字符串,它指定了结果应该如何被格式化。格式字符串中的文本被直接复制到结果中,除了使用格式说明符的地方。格式说明符在字符串中扮演着占位符的角色,它定义后续的函数参数如何被格式化及插入到结果中。每一个``formatarg``参数会被根据其数据类型的常规输出规则转换为文本,并接着根据格式说明符被格式化和插入到结果字符串中。 格式说明符由一个%字符开始并且有这样的形式

%[position][flags][width]type

其中的各组件域是:

position(可选)

一个形式为n$的字符串,其中``n``是要打印的参数的索引。索引 1 表示``formatstr``之后的第一个参数。如果``position``被忽略,默认会使用序列中的下一个参数。

flags(可选)

控制格式说明符的输出如何被格式化的附加选项。当前唯一支持的标志是一个负号(-),它将导致格式说明符的输出会被左对齐(left-justified)。除非``width``域也被指定,否者这个域不会产生任何效果。

width(可选)

指定用于显示格式说明符输出的最小字符数。输出将被在左部或右部(取决于-标志)用空格填充以保证充满该宽度。太小的宽度设置不会导致输出被截断,但是会被简单地忽略。宽度可以使用下列形式之一指定:一个正整数;一个星号(*)表示使用下一个函数参数作为宽度;或者一个形式为*n$的字符串表示使用第``n``个函数参数作为宽度。

如果宽度来自于一个函数参数,则参数在被格式说明符的值使用之前就被消耗掉了。如果宽度参数是负值,结果会在长度为abs(``width``)的域中被左对齐(如果-标志被指定)。

type(必需)

格式转换的类型,用于产生格式说明符的输出。支持下面的类型:

  • s将参数值格式化为一个简单字符串。一个控制被视为一个空字符串。

  • I将参数值视作 SQL 标识符,并在必要时用双写引号包围它。如果参数为空,将会是一个错误(等效于quote_ident)。

  • L将参数值引用为 SQL 文字。一个空值将被显示为不带引号的字符串NULL(等效于quote_nullable)。

除了以上所述的格式说明符之外,要输出一个文字形式的%字符,可以使用特殊序列%%

例子:

下面有一些基本的格式转换的例子:

SELECT format('Hello %s', 'World');
结果:Hello World

SELECT format('Testing %s, %s, %s, %%', 'one', 'two', 'three');
结果:Testing one, two, three, %

SELECT format('INSERT INTO %I VALUES(%L)', 'Foo bar', E'O\'Reilly');
结果:INSERT INTO "Foo bar" VALUES('O''Reilly')

SELECT format('INSERT INTO %I VALUES(%L)', 'locations', 'C:\Program Files');
结果:INSERT INTO locations VALUES(E'C:\\Program Files')

下面是使用``width``域和-标志的例子:

SELECT format('|%10s|', 'foo');
结果:|       foo|

SELECT format('|%-10s|', 'foo');
结果:|foo       |

SELECT format('|%*s|', 10, 'foo');
结果:|       foo|

SELECT format('|%*s|', -10, 'foo');
结果:|foo       |

SELECT format('|%-*s|', 10, 'foo');
结果:|foo       |

SELECT format('|%-*s|', -10, 'foo');
结果:|foo       |

这些例子展示了``position``域的例子:

SELECT format('Testing %3$s, %2$s, %1$s', 'one', 'two', 'three');
结果:Testing three, two, one

SELECT format('|%*2$s|', 'foo', 10, 'bar');
结果:|       bar|

SELECT format('|%1$*2$s|', 'foo', 10, 'bar');
结果:|       foo|

不同于标准的 C 函数sprintf,KingbaseES的format函数允许将带有或者不带有``position``域的格式说明符被混在同一个格式字符串中。一个不带有``position``域的格式说明符总是使用最后一个被消耗的参数的下一个参数。另外,format函数不要求所有函数参数都被用在格式字符串中。例如:

SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
结果:Testing three, two, three

对于安全地构造动态 SQL 语句,%I%L格式说明符特别有用。

8.128. FORMAT_TYPE

用法:

format_type(type_oid, typemod)

功能:

format_type返回一个数据类型的 SQL 名称,它由它的类型 OID 标识并且可能是一个类型修饰符。如果不知道相关的修饰符,则为类型修饰符传递 NULL。

例子:

SELECT format_type('varchar'::regtype, 42);

8.129. GENERATE_SERIES

用法:

generate_series(start, stop)
generate_series(start, stop, step)
generate_series(start, stop, step interval)

功能:

级数生成函数,产生一系列值,从start 到stop ,默认步长为1,当指定 step 参数时,步长为 step 。 当``step``为正时,如果``start``大于``stop``则返回零行。相反,当``step``为负时,如果``start``小于``stop``则返回零行。对于NULL输入也会返回零行。``step``为零是一个错误。

例子:

SELECT * FROM generate_series(2,4);


SELECT * FROM generate_series(5,1,-2);

SELECT * FROM generate_series(4,3);

SELECT generate_series(1.1, 4, 1.3);

SELECT current_date + s.a AS dates FROM generate_series(0,14,7) AS s(a);

SELECT * FROM generate_series('2008-03-01 00:00'::timestamp, '2008-03-04 12:00', '10 hours');

8.130. GENERATE_SUBSCRIPTS

用法:

generate_subscripts(array anyarray, dim int)
generate_subscripts(array anyarray, dim int, reverse boolean)

功能:

下标生成函数,生成一个级数组成给定数组的下标。当 reverse 为真时,级数以逆序返回。

例子:

-- 基本使用

SELECT generate_subscripts('{NULL,1,NULL,2}'::int[], 1) AS s;

—表示一个数组,下标和被下标的值需要一个子查询

SELECT a AS array, s AS subscript, a[s] AS value FROM (SELECT generate_subscripts(a, 1) AS s, a FROM arrays) foo;

—平面化一个 2D 数组

CREATE OR REPLACE FUNCTION unnest2(anyarray)
RETURNS SETOF anyelement AS $$
select $1[i][j]
   from generate_subscripts($1,1) g1(i),
        generate_subscripts($1,2) g2(j);
$$ LANGUAGE sql IMMUTABLE;
CREATE FUNCTION
SELECT * FROM unnest2(ARRAY[[1,2],[3,4]]);

8.131. GET_BIT

用法:

get_bit(string, offset)

功能:

二进制串函数,从二进制串中抽取 offset 指定的位。get_bit 在每一个字节中从右边起计数位;例如位 0 是第一个字节的最低有效位,而位 15 是第二个字节的最高有效位。 除了可以用于二进制串之外,也可以用于位串, 当使用于一个位串时,函数将串的第一(最左)位计数为位 0。

例子:

二进制串操作

SELECT get_bit('Th\000omas'::bytea, 45);

8.132. GET_BYTE

用法:

get_byte(string, offset)

功能:

二进制串函数,从二进制串中抽取 offset 指定的字节。把一个二进制串中的一个字节计数为字节 0。。 除了可以用于二进制串之外,也可以用于位串, 当使用于一个位串时,函数将串的第一(最左)位计数为位 0。

例子:

二进制串操作

SELECT get_byte('Th\000omas'::bytea, 4);

8.133. GET_CURRENT_TS_CONFIG

用法:

get_current_ts_config()

功能:

获取默认文本搜索配置信息

例子:

SELECT get_current_ts_config();

8.134. GET_DISK_INFO

用法:

get_disk_info(file_path IN TEXT, dev OUT TEXT, mount_point OUT TEXT, size OUT TEXT, used OUT TEXT))

功能:

指定文件系统路径,返回路径所在设备名,挂载点,单位字节的容量和已使用容量等磁盘使用信息。

例子:

获取Oid为1663的表空间对象磁盘占用信息

SELECT get_disk_info(pg_tablespace_location(1663));

8.135. GET_LICENSE_VALIDDAYS

用法:

get_license_validdays()

功能:

返回license剩余有效时间。

例子:

SELECT get_license_validdays();

8.136. GETUSERNAME

用法:

getusername()

功能:

返回当前用户名。

例子:

SELECT getusername();

8.137. GREATEST

用法:

GREATEST(value [, ...])

功能:

函数从一个任意的数字表达式列表里选取最大的数值。表达式必须都可以转换成一个普通的数据类型,它将会是结果类型(参阅 UNION CASE和相关结构 获取细节)。列表中的 NULL 数值将被忽略。只有所有表达式的结果都是 NULL 的时候,结果才会是 NULL。

例子:

SELECT greatest('abc','abb','aba','bbb');

8.138. GROUP_CONCAT

用法:

GROUP_CONCAT([DISTINCT] col [ORDER BY col ] [SEPARATOR str_val])

功能:

将指定表达式的结果集中的非空字符连接成一个字符串并返回。该函数被封装在kdb_utils_function扩展中,调用此函数需要首先创建kdb_utils_function扩展。

参数说明:

clo:任意数组或非数组类型的字段。

str_val:任意非空的可见字符或字符串,最大长度1073741823。

返回值说明:

返回值类型:text。 当表达式结果类型为bytea时,返回的包含二进制字符串的串联值,数据类型为text。 暂不支持用户自定义设置返回结果的最大长度。函数返回值长度最大支持1073741823。当返回值完整长度大于设置的最大长度时,结果将被截断。

例子:

CREATE TABLE group_concat_test(a int, b int ,c int PRIMARY KEY);

INSERT INTO group_concat_test VALUES(1,1,3);

INSERT INTO group_concat_test VALUES(2,3,2);

INSERT INTO group_concat_test VALUES(3,2,1);

INSERT INTO group_concat_test VALUES(1,2,0);

INSERT INTO group_concat_test VALUES(NULL,2,6);

CREATE EXTENSION kdb_utils_function;

SELECT group_concat(a) FROM group_concat_test;


SELECT group_concat(distinct a) FROM group_concat_test;


SELECT group_concat(b order by b desc) FROM group_concat_test;

SELECT group_concat(b separator '--') FROM group_concat_test;

SELECT group_concat(a order by b,c) FROM t1;

8.139. GROUPING

用法:

grouping(args...)

功能:

GROUPING将超聚合行与常规分组行区分开来。GROUP BY扩展,例如ROLLUP和CUBE生成超聚合行,其中所有值的集合由 null 表示。使用该GROUPING函数,您可以将表示超聚合行中所有值的集合的空值与常规行中的空值区分开来。

expr函数中的必须GROUPING匹配GROUP BY子句中的表达式之一。expr如果该行中的值是表示所有值的集合的空值,则该函数返回值 1 。否则,它返回零。函数返回值的数据类型GROUPING为 KingBase NUMBER。有关这些术语的讨论,请参阅SELECT group_by_clause。

例子:

在以下示例中,它使用示例表hr.departments,hr.employees如果GROUPING函数返回 1(表示超聚合行而不是表中的常规行),则字符串“All Jobs”出现在“JOB”列中,而不是 null否则会出现:

SELECT DECODE(GROUPING(department_name), 1, 'ALL DEPARTMENTS', department_na
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值