9.32. MySQL兼容函数

9.32.1. 数学函数
9.32.2. 字符串函数
9.32.3. 日期/时间函数
9.32.4. JSON Functions
9.32.5. 条件表达式
9.32.6. 聚合函数
9.32.7. 系统信息函数和运算符
9.32.8. 杂项函数
9.32.9. 运算符
9.32.10. 算术运算符
9.32.11. 比较操作符
9.32.12. 类型转换
9.32.13. AES加解密

9.32.1. 数学函数

支持以下数学函数:

  • CONV

  • LOG10

  • LOG2

  • RAND

  • TRUNCATE

9.32.1.1. CONV

描述

在不同的进制之间转换数字。

语法

conv( p_num text, p_from_base int4, p_to_base int4) RETURNS text
    

常规规则

  • 在不同的进制之间转换数字。

  • 将数字N从进制from_base转换为进制to_base并返回字符串表示形式。如果任何参数为NULL,则返回NULL。参数N被解释为整数,但可以指定为整数或字符串。

  • 最小进制为2,最大进制为36。如果from_base是负数,则N被视为带符号数。否则,N被视为无符号数。CONV()使用64位精度。

示例

在以下示例中,'123456'从10进制转换为16进制是1E240。

select conv('123456', 10, 16);
conv  
-------
1E240
(1 row)
    

9.32.1.2. LOG10

描述

返回参数的以10为底的对数。

语法

log10(p1 numeric) RETURNS numeric
log10(p1 double precision) RETURNS double precision
    

常规规则

  • 返回p1的以10为底的对数。如果X小于或等于0.0E0,则该函数返回NULL并报告警告“对数的参数无效”。

示例

在以下示例中,返回参数2的以10为底的对数。

select log10(2);
      log10        
--------------------
0.3010299956639812
(1 row)
    

9.32.1.3. LOG2

描述

返回参数的以2为底的对数。

语法

log2(p_num numeric) RETURNS numeric
    

常规规则

  • 返回p_num的以2为底的对数。如果p_num小于或等于0.0E0,则该函数返回NULL并报告警告“对数的参数无效”。

示例

在以下示例中,返回参数64的以2为底的对数。

select log2(64);
        log2        
--------------------
6.0000000000000000
(1 row)
    

9.32.1.4. RAND

描述

返回范围在0和1.0之间的随机浮点值v。

语法

rand(p_seed int default null) RETURNS double precision
    

常规规则

  • 使用常量初始化参数时,种子在语句准备好之后,在执行之前仅初始化一次。

  • 使用非常量初始化参数(例如列名)时,种子将在每次调用RAND()时使用值进行初始化。

  • 这种行为的一个影响是,对于相同的参数值,RAND(N)每次返回相同的值,从而产生一系列可重复的列值。

  • 在WHERE子句中使用RAND()会对每一行(从单个表中选择时)或每一行组合(从多张表连接时)进行求值。

示例

在以下示例中,RAND(123)产生的值序列在出现的两个位置都相同。

select rand(123);
        rand
---------------------
 0.05425240159967615
(1 row)
        

9.32.1.5. TRUNCATE

描述

截取指定小数位数。

语法

TRUNCATE(SMALLINT X,INTEGER D) returns INTEGER
TRUNCATE(INTEGER X,INTEGER D) returns INTEGER
TRUNCATE(BIGINT X,INTEGER D) returns BIGINT
TRUNCATE(DOUBLE PRECISION X,INTEGER D) returns DOUBLE PRECISION
TRUNCATE(NUMERIC,INTEGER D) returns NUMERIC
    

通用规则

  • 返回截取到小数点后D位的数字X。

  • 如果D为0,则结果没有小数点或小数部分。

  • D可以是负数,使值X的小数点左侧的D位数字变为零。

示例

在以下示例中,返回将"1.223"截取到小数点后1位的结果。

SELECT TRUNCATE(1.223,1);
  truncate
----------
      1.2
(1 row)
        

9.32.2. 字符串函数

以下字符串函数得到支持:

  • ELT

  • FIELD

  • FIND_IN_SET

  • INSTR

  • FROM_BASE64

  • INSERT

  • LCASE

  • LOCATE

  • MID

  • SPACE

  • STRCMP

  • TO_BASE64

  • UCASE

  • SUBSTR

  • SUBSTRING

  • SUBSTRING_INDEX

9.32.2.1. ELT

描述

返回索引号处的字符串。

语法

elt(str_pos int, VARIADIC strlist text[]) RETURNS text 
    

通用规则

  • ELT()返回字符串列表中的第str_pos个元素:如果str_pos = 1,则为str1,如果str_pos = 2,则为str2,以此类推。

  • 如果N小于1或大于参数个数,则返回NULL。

  • ELT() 是 FIELD() 的补充函数。

示例

在以下例子中,返回第 2 个元素 'Bb'。

select elt( 2, 'Aa', 'Bb', 'Cc', 'Dd', 'Ff');
elt
-----
Bb
(1 row)
    

9.32.2.2. FIELD

描述

第一个参数在后续参数中的位置(索引)。

语法

field(str text, VARIADIC strlist text[]) RETURNS bigint
field(str numeric, VARIADIC strlist numeric[]) RETURNS bigint   
    

一般规则

  • 返回字符串 str 在字符串列表 str1, str2, str3, ... 中的索引(位置)。如果 str 未找到,则返回 0。

  • 如果 FIELD() 的所有参数都是字符串,则将它们作为字符串进行比较。如果所有参数都是数字,则将它们作为数字进行比较。否则,将参数作为双精度数进行比较。

  • 如果 str 是 NULL,则返回值为 0,因为 NULL 与任何值都不相等。FIELD() 是 ELT() 的补充函数。

示例

在以下例子中,返回字符串 'Bb' 在字符串列表 'Aa', 'Bb', 'Cc', 'Dd', 'Ff' 中的索引(位置) 2。

select field('Bb', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff');
field
-------
    2
(1 row)
    

9.32.2.3. FIND_IN_SET

描述

第一个参数在第二个参数中的位置(索引)。

语法

FIND_IN_SET(str "any",strlist TEXT) returns INTEGER
    

一般规则

  • 如果字符串 str 在由 N 个子字符串组成的字符串列表 strlist 中,则返回 1 到 N 的值。 strlist 是由逗号字符分隔的子字符串组成的字符串。

  • 如果 str 不在 strlist 中或 strlist 是空字符串,则返回 0。

  • 如果任一参数为 NULL,则返回 NULL。如果第一个参数包含逗号 (,) 字符,则此函数不正常工作。

  • 如果第一个参数不是字符串类型,则第一个参数将被转换为字符串类型。换句话说,find_in_set(n,strlist) 等效于 find_in_set(n::text,strlist)

  • 返回值的数据类型为整数。

示例

在以下例子中,返回字符串 'a,b,c,d' 中字符 'b' 的位置(索引)。

SELECT FIND_IN_SET('b','a,b,c,d');
  find_in_set
-------------
            2
(1 row)
    

9.32.2.4. FROM_BASE64

描述

解码 base64 编码的字符串并返回结果。

语法

from_base64(p_str text) RETURNS text
    

一般规则

  • 接受一个使用 TO_BASE64() 使用的 base-64 编码规则编码的字符串,并将解码后的结果作为二进制字符串返回。

  • 如果参数为 NULL 或不是有效的 base-64 字符串,则结果为 NULL。

  • 有关编码和解码规则的详细信息,请参见 TO_BASE64() 的描述。

示例

在以下例子中,解码 base64 编码的字符串 'YWJj' 并返回结果 'abc'。

select from_base64('YWJj');
from_base64
-------------
abc
(1 row)
    

9.32.2.5. 插入

描述

在指定位置插入子字符串,直到指定的字符数。

语法

          insert(p_source text, p_pos bigint, p_len bigint, p_replacement text) RETURNS text
        

通用规则

  • 返回字符串str,将从位置pos开始并长度为len的子字符串替换为newstr。

  • 如果pos不在字符串的长度范围内,则返回原始字符串。如果len不在其余字符串的长度范围内,则从位置pos替换其余字符串。

  • 如果任何参数为NULL,则返回NULL。

示例

在下面的示例中,在指定位置3插入子字符串'What',直到指定的字符数4。

select insert('Quadratic', 3, 4, 'What');
  insert
-----------
QuWhattic
(1 row)
    

9.32.2.6. INSTR

描述

获取子字符串的第一次出现的位置。

语法

          instr(str text, patt text) RETURNS int
        

通用规则

  • 从1开始,在字符串str中获取子字符串patt的第一次出现的位置。

  • 如果未找到,则返回0。

示例

在下面的示例中,在字符串'abc124deff4de'中,子字符串'4de'的第一次出现的位置是6。

select instr('abc124deff4de', '4de');
 instr 
-------
     6
(1 row)
    

9.32.2.7. LCASE

描述

LOWER()的同义词。

语法

lcase(p_source text) RETURNS text
    

通用规则

  • LCASE()是LOWER()的同义词。

  • 根据当前字符集映射,将字符串str中的所有字符更改为小写。默认为utf8mb4。

示例

在下面的示例中,返回字符串'quadratic',其中所有字符都已更改为小写。

select lcase('QuadRatic');
  lcase
-----------
quadratic
(1 row)
    

9.32.2.8. LOCATE

描述

返回子字符串第一次出现的位置。

语法

LOCATE(substr TEXT,str TEXT) returns INTEGER
LOCATE(substr TEXT,str TEXT,POS INTEGER) returns INTEGER
    

通用规则

  • 第一种语法返回字符串str中子字符串substr的第一次出现的位置。

  • 第二种语法返回字符串str中子字符串substr在位置pos开始的第一次出现的位置。

  • 如果在str中没有找到substr,则返回0。

  • 如果任何参数为NULL,则返回NULL。

示例

在下面的示例中,返回'foobarbar'中'bar'在位置5开始的出现位置。

SELECT LOCATE('bar', 'foobarbar', 5);
  locate 
--------
      7
(1 row)
    

9.32.2.9. MID

描述

从指定位置开始返回一个子字符串。

语法

mid(p_source text, p_pos bigint, p_len bigint) RETURNS text
    

通用规则

  • 不带 len 参数的形式从字符串 str 的位置 pos 开始返回一个子字符串。带有 len 参数的形式从字符串 str 的位置 pos 开始返回一个长度为 len 的子字符串。

  • pos 也可以使用负值。在这种情况下,子字符串的开头是距离字符串末尾 pos 个字符,而不是开头。负值可以用于此函数的任何形式中的 pos。对于 pos 的值为 0,返回一个空字符串。

示例

在下面的示例中,从指定位置 2 开始返回子字符串 'ongy'。

select mid('Hongye', 2, 4);
mid
------
ongy
(1 row)
    

9.32.2.10. SPACE

描述

返回指定数量的空格字符串。

语法

          space(p_num int) RETURNS text
        

通用规则

  • 返回由 N 个空格字符组成的字符串。

示例

在下面的示例中,返回指定数量的空格字符串。

select concat('|', space(11), '|');
    concat     
---------------
|           |
(1 row)
    

9.32.2.11. STRCMP

描述

比较两个字符串。

语法

strcmp(p1 text, p2 text) RETURNS int
    

通用规则

  • STRCMP() 返回 0 表示两个字符串相同,返回 -1 表示第一个参数小于第二个参数按照当前的排序顺序,返回 1 表示其他情况。

示例

在下面的示例中,如果第一个参数按照当前的排序顺序小于第二个参数,则返回 -1。

select strcmp('text', 'text2');
strcmp 
--------
    -1
(1 row)
    

9.32.2.12. TO_BASE64

描述

将参数转换为 base-64 字符串并返回。

语法

to_base64(p_str text) RETURNS text
    

通用规则

  • 将字符串参数转换为 base-64 编码形式,并返回一个使用连接字符集和排序规则的字符字符串作为结果。

  • 如果参数不是字符串,则在进行转换之前将其转换为字符串。如果参数为 NULL,则结果为 NULL。

  • 使用 FROM_BASE64() 函数可以解码 base-64 编码字符串。

示例

在下面的示例中,将参数 'abc' 转换为 base-64 字符串 'YWJj' 并返回。

select to_base64('abc');
to_base64 
-----------
YWJj
(1 row)
    

9.32.2.13. UCASE

描述

UPPER() 的同义词。

语法

ucase(p_source text) RETURNS text
    

通用规则

  • 将字符串 str 中的所有字符根据当前字符集映射更改为大写。默认字符集为 utf8mb4。

示例

在下面的示例中,将字符串 'QUADRATIC' 中的所有字符根据当前字符集映射更改为大写并返回。

select ucase('QuadRatic');
  ucase   
-----------
QUADRATIC
(1 row)
    

9.32.2.14. SUBSTR

描述

返回按指定要求截取的子字符串。

语法

substr(str text, pos int) RETURNS text
substr(str text, pos int, len int) RETURNS text
    

通用规则

  • 不带 len 参数的形式返回从字符串 str 中位置 pos 开始的子字符串。带有 len 参数的形式返回从字符串 str 中位置 pos 开始长度为 len 的子字符串。

  • pos 参数也可以使用负数。在这种情况下,子字符串的开始位置是距离字符串结尾 pos 个字符,而不是开头。pos 参数可以在此函数的任何形式中使用负值。当 pos 参数为 0 时,返回空字符串。

  • 此函数支持多字节字符集。如果任何参数为 NULL,则返回 NULL。

  • 如果 len 小于 1,则结果为空字符串。

  • 如果 pos 和 len 都接受数字类型,则也是可以的。如果输入的小数部分小于 0.5,则将其四舍五入为整数部分。否则,将正数的四舍五入为输入值加上 0.5 的下限,将负数的四舍五入为输入值减去 0.5 的下限。

示例

在下面的示例中,结果为 bc。

select substr('abc',-2,2);
 substr
--------
 bc
(1 row)
    

9.32.2.15. SUBSTRING

描述

根据指定要求返回子字符串。

语法

substring(str text, pos int) RETURNS text
substring(str text, pos int, len int) RETURNS text
    

一般规则

  • substring 是 substr 的同义词。

示例

在以下的示例中,结果是 bc。

select substring('abc',-2,2);
 substring
--------
 bc
(1 row)
    

9.32.2.16. SUBSTRING_INDEX

描述

从指定字符串中返回指定分隔符出现n次数前的子字符串

语法

substring_index(str varchar, delim varchar, count integer) RETURNS varchar
    

一般规则

  • 从指定字符串中返回到达分隔符delim出现次数之前的子字符串。

  • 如果count为正,则返回最后一个分隔符左侧的所有元素(从左侧开始计数)。

  • 如果count为负数,则返回最后一个分隔符右侧的所有内容(从右侧开始计数)。

  • SUBSTRING_INDEX()在搜索delim时区分大小写。

  • 这个函数是多字节安全的。

  • 如果SUBSTRING_INDEX()的任何参数为NULL,则返回NULL。

  • 当分隔符为 ''时,函数返回''(和mysql一致).

示例

lightdb@test_m=# SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
 substring_index 
-----------------
 www.mysql
(1 row)

lightdb@test_m=# SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
 substring_index 
-----------------
 mysql.com
(1 row)
    

9.32.3. 日期/时间函数

支持以下日期/时间函数:

  • DATEDIFF

  • DATE_ADD

  • DATE_FORMAT

  • DATE_SUB

  • DAY

  • DAYOFWEEK

  • FROM_UNIXTIME

  • STR_TO_DATE

  • SYSDATE

  • SEC_TO_TIME

  • TIME_TO_SEC

  • TIMEDIFF

  • TIMESTAMPDIFF

  • TO_DAYS

  • TO_SECONDS

  • UNIX_TIMESTAMP

  • WEEKOFYEAR

  • YEAR

  • QUARTER

  • LAST_DAY

  • CURDATE

9.32.3.1. DATEDIFF

描述

减去两个日期。

语法

DATEDIFF(expr1 timestamp,expr2 timestamp) RETURN integer
DATEDIFF(expr1 text,expr2 text) RETURN integer
DATEDIFF(expr1 timestamptz,expr2 timestamptz) RETURN integer
DATEDIFF(expr1 timestamptz,expr2 timestamp) RETURN integer
DATEDIFF(expr1 timestamp,expr2 timestamptz) RETURN integer
DATEDIFF(expr1 date, expr2 date) RETURN integer
DATEDIFF(expr1 date, expr2 numeric) RETURN integer
DATEDIFF(expr1 numeric, expr2 date) RETURN integer
DATEDIFF(expr1 numeric, expr2 numeric) RETURN integer
        

一般规则

  • expr1expr2 表示从一天到另一天的天数。expr1expr2 是日期或日期时间表达式。计算中仅使用这些值的日期部分。

  • 如果任一参数为 NULL,则返回 NULL。

  • 不支持 time 类型相减

示例

在以下示例中,返回 1,因为 '2007-12-31' 减去 '2007-12-30' 等于 1

SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30');
datediff 
----------
 1
(1 row)
SELECT DATEDIFF(cast('2007-12-31 23:59:59' as datetime),cast('2007-12-30' as datetime));
 datediff 
----------
        1
(1 row)
SELECT DATEDIFF(cast('2007-12-31 23:59:59' as date),cast('2007-12-30' as date));
 datediff 
----------
        1
(1 row)
        

9.32.3.2. DATE_ADD

描述

日期加法。

语法

DATE_ADD(expr1 timestamptz, expr2 interval) RETURN date
DATE_ADD(expr1 text, expr2 interval) RETURN date
        

一般规则

  • 返回添加间隔(年/月/日)到 expr1 日期参数后的日期类型。

  • 第二个参数 expr2 仅支持间隔(年/月/日)。

示例

在下面的例子中,返回'2020-01-02',因为'20200101'加上1天。

select date_add('20200101', interval 1 day);
  date_add  
------------
2020-01-02
(1 row)
    

9.32.3.3. DATE_FORMAT

描述

日期格式显示。

语法

DATE_FORMAT(expr1 timestamp, expr2 text) RETURN text
DATE_FORMAT(expr1 timestamptz, expr2 text) RETURN text
DATE_FORMAT(expr1 text, expr2 text) RETURN text
        

通用规则

  • 返回expr1时间参数,在expr2格式中显示和输出。

例子

在下面的例子中,返回'2021/12/01 11,59,59',因为expr2是'%Y/%m/%d %h,%i,%s'格式。

select date_format('20211201 11:59:59','%Y/%m/%d %h,%i,%s');
      date_format     
---------------------
  2021/12/01 11,59,59
(1 row)
    

Table 9.107 显示了可用于格式化date_format值的模板模式。

Table 9.107. date_format格式化的模板模式

PatternDescription
%a 缩写的星期名称
%b 缩写的月份名称
%c 月份,值
%D 带有英文前缀的月份中的日
%d 月份中的日,值(00-31)
%e 月份中的日,值(0-31)
%f 微秒
%H 小时(00-23)
%h 小时(01-12)
%I 小时(01-12)
%i 分钟,值(00-59)
%j 年份中的日(001-366)
%k 小时(0-23)
%l 小时(1-12)
%M 月份名称
%m 月份,值(00-12)
%p 上午或下午
%r 时间,12小时制(hh:mm:ss AM或PM)
%S 秒(00-59)
%s 秒(00-59)
%T 时间,24小时制(hh:mm:ss)
%W 星期名称
%Y 年份,4位数
%y 年份,2位数字

9.32.3.4. DATE_SUB

描述

日期减法。

语法

DATE_SUB(expr1 timestamptz, expr2 interval) RETURN date
DATE_SUB(expr1 text, expr2 interval) RETURN date
        

一般规则

  • 返回 expr1 日期参数减去间隔(年/月/日)后的日期类型

  • 第二个参数 expr2 只支持间隔(年/月/日)

示例

在以下示例中,“20200101” 减去一天后返回“2019-12-31”

select date_sub('20200101', interval 1 day);
  date_sub  
------------
2019-12-31
(1 row)
    

9.32.3.5. DAY

描述

返回月份日期。

语法

DAY(expr1 text) RETURN int2
DAY(expr1 timestamptz) RETURN int4
        

一般规则

  • 返回给定 expr1 日期的月份部分

  • 仅支持月和日参数,例如“0101”、“0704”。

示例

在以下示例中,“2011/12/01” 的日期是 “1”,因此返回 “1”。

select day('2011/12/01');
day 
-----
  1
(1 row)
    

9.32.3.6. DAYOFWEEK

描述

返回星期几。

语法

DAYOFWEEK(expr1 text) RETURN int4
DAYOFWEEK(expr1 timestamptz) RETURN int4
        

一般规则

  • 根据 expr1 日期参数返回星期几。返回值为 1 ~ 7,星期日为 1。

  • 至少包括完整的时间格式,例如 20200202、200202。不支持少于 6 位的参数。

示例

在以下示例中,“20200101” 是星期三,因此返回 “4”。

select dayofweek(20200101);
  dayofweek 
-----------
          4
(1 row)
    

9.32.3.7. FROM_UNIXTIME

描述

根据 UNIX 时间戳返回时间格式。

语法

FROM_UNIXTIME(expr1 text) RETURN timestamp
FROM_UNIXTIME(expr1 int8) RETURN timestamp
FROM_UNIXTIME(expr1 text, expr2 text) RETURN text
FROM_UNIXTIME(expr1 int8, expr2 text) RETURN text
    

一般规则

  • 根据 expr1 参数的 UNIX 时间戳返回时间格式。日期格式可以根据 expr2 参数进行指定。

示例

在以下示例中,根据 UNIX 时间戳 20220910 返回时间戳。

select from_unixtime(20220910);
    from_unixtime    
---------------------
  1970-08-23 08:55:10
(1 row)
select from_unixtime(20220910, '%Y/%m/%d %h,%i,%s');
    from_unixtime    
---------------------
  1970/08/23 08,55,10
(1 row)
    

Table 9.108 显示了可用于格式化 from_unixtime 值的模板模式。

Table 9.108. from_unixtime 格式化的模板模式

模式描述
%a 缩写星期名称
%b 缩写月份名称
%c 月份,数字表示
%D 带英文前缀的月份天数
%d 月份天数,数字表示(00-31)
%e 月份天数,数字表示(0-31)
%f 微秒
%H 小时数(00-23)
%h 小时数(01-12)
%I 小时数(01-12)
%i 分钟数,数字表示(00-59)
%j 年份中的天数(001-366)
%k 小时数(0-23)
%l 小时数(1-12)
%M 月份名称
%m 月份,数字表示(00-12)
%p 上午或下午
%r 时间,12小时制(hh:mm:ss 上午或下午)
%S 秒数(00-59)
%s 秒数(00-59)
%T 时间,24小时制(hh:mm:ss)
%W 星期名称
%Y 年份,4位数字
%y 年份,2位数字

9.32.3.8. SEC_TO_TIME

描述

将秒转换为“hh:mm:ss”格式。

语法

sec_to_time(p_secs int) RETURNS interval
    

通用规则

  • 返回将秒参数转换为小时、分钟和秒的时间值。

  • 结果的范围受到 TIME 数据类型的限制。如果参数对应于超出该范围的值,则会发出警告。

示例

在下面的例子中,将秒数 80580 转换成 'hh:mm:ss' 格式的时间,即 22:23:00。

select mysql.sec_to_time(80580);
sec_to_time
-------------
22:23:00
(1 row)
    

9.32.3.9. STR_TO_DATE

描述

将字符串转换为时间值。这是 DATE_FORMAT() 函数的反函数。它接受一个字符串 str 和一个格式字符串 format。 如果格式字符串包含日期和时间部分,STR_TO_DATE() 返回一个 DATETIME 值。如果字符串仅包含日期或时间部分, 则返回 DATE 或 TIME 值。如果从 str 中提取的日期、时间或日期时间值是非法的,STR_TO_DATE() 将返回错误。

语法

STR_TO_DATE(datetime_str text, datetime_format text) RETURN datetime
STR_TO_DATE(date_str text, date_format text) RETURN date
STR_TO_DATE(time_str text, time_format text) RETURN time
    

通用规则

  • 将字符串参数 str 和格式参数 format 转换为时间值。

  • 如果启用了 NO_ZERO_DATE SQL 模式,则不允许使用零日期。在这种情况下,STR_TO_DATE() 返回 NULL。

示例

在下面的例子中,根据时间戳 '2022/09/10 11,13,13' 和格式字符串 '%Y/%m/%d %h,%i,%s' 返回 '2022-09-10 11:13:13'。 如果格式字符串包含日期和时间部分,则返回一个 DATETIME 值。

select str_to_date('2022/09/10 11,13,13', '%Y/%m/%d %h,%i,%s');
      str_to_date     
---------------------
  2022-09-10 11:13:13
(1 row)
    

在下面的例子中,因为格式字符串仅包含日期部分,所以返回一个 DATE 值。

select str_to_date('2022/09/10', '%Y/%m/%d');
      str_to_date     
---------------------
  2022-09-10
(1 row)
    

在下面的例子中,因为格式字符串仅包含时间部分,所以返回一个 TIME 值。

select str_to_date('09:00:59', '%h:%i:%s');
      str_to_date     
---------------------
  09:00:59
(1 row)
    

如果启用了 NO_ZERO_DATE SQL 模式,则不允许使用零日期。在这种情况下,STR_TO_DATE() 返回 NULL。

set lightdb_sql_mode = 'no_zero_date';
select str_to_date('2022/09/0', '%Y/%m/%d');
    str_to_date 
-------------
 
(1 row)
    

Table 9.109 显示了可用于格式化 STR_TO_DATE 值的模板模式。

Table 9.109. str_to_date 格式化的模板模式

PatternDescription
%a 缩写的星期名称
%b 缩写的月份名称
%c 月份,值
%D 带有英文前缀的日期
%d 月份中的日,值为 (00-31)
%e 月份中的日,值为 (0-31)
%f 毫秒
%H 小时数,值为 (00-23)
%h 小时数,值为 (01-12)
%I 小时数,值为 (01-12)
%i 分钟数,值为 (00-59)
%j 年中的天数,值为 (001-366)
%k 小时数,值为 (0-23)
%l 小时数,值为 (1-12)
%M 月份名称
%m 月份,数字表示(00-12)
%p 上午或下午
%r 时间,12小时制(hh:mm:ss 上午或下午)
%S 秒数(00-59)
%s 从 1970 年 1 月 1 日开始到现在的秒数
%T 时间,24小时制(hh:mm:ss)
%W 星期名称
%Y 年份,4位数字表示
%y 年份,2位数字表示

9.32.3.10. SYSDATE

描述

返回函数执行时的时间。

语法

sysdate() RETURNS timestamp(0)
    

一般规则

  • 返回的时间是函数执行时的时间,是不确定的。

  • 返回的时间受当前时区设置影响。

  • 自版本23.2开始支持此函数。

示例如下:

select sysdate;
       sysdate
---------------------
 2023-05-06 16:06:59
(1 row)
    

9.32.3.11. TIME_TO_SEC

描述

将参数转换为秒并返回。

语法

          time_to_sec(p_time time) RETURNS int
        

通用规则

  • 返回转换为秒的时间参数。

示例

在以下示例中,将时间参数 '22:23:00' 转换为秒数 80580 并返回。

select time_to_sec('22:23:00');
time_to_sec 
-------------
      80580
(1 row)
    

9.32.3.12. TIMEDIFF

描述

计算时间差。

语法

timediff(p_date1 timestamptz, p_date2 timestamptz) RETURNS interval
    

通用规则

  • TIMEDIFF() 将两个时间表达式相减并返回一个时间值。expr1 和 expr2 都必须是时间或日期时间表达式,并且类型必须相同。

  • TIMEDIFF() 返回的结果范围限制在 TIME 值允许的范围内。或者,您可以使用 TIMESTAMPDIFF() 和 UNIX_TIMESTAMP() 这两个函数,两者都返回整数值。

示例

在以下示例中,将 '2000-01-01 00:00:00' 和 '2000-01-01 00:00:00.000001' 相减并将结果表示为时间值。

      select mysql.timediff('2000-01-01 00:00:00', '2000-01-01 00:00:00.000001');
          timediff
      ------------------
      -00:00:00.000001
      (1 row)
    

9.32.3.13. TIMESTAMPDIFF

描述

从日期时间表达式中减去一个时间间隔。

语法

timestampdiff( p_unit text, p_ts1  text, p_ts2  text) RETURNS bigint
timestampdiff( p_unit text, p_ts1  text, p_ts2  timestamptz) RETURNS bigint
timestampdiff( p_unit text, p_ts1  timestamptz, p_ts2  text) RETURNS bigint
timestampdiff( p_unit text, p_ts1  timestamptz, p_ts2  timestamptz) RETURNS bigint
    

通用规则

  • 返回 datetime_expr2 − datetime_expr1 的值,其中 datetime_expr1 和 datetime_expr2 是日期或日期时间表达式。

  • 其中一个表达式可以是日期,另一个可以是日期时间。必要时,日期值将被视为时间部分为'00:00:00'的日期时间。

  • 结果的单位(整数)由单位参数给出。单位参数支持 MICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAR,可以带引号或者不带引号

示例

在以下示例中,返回 '1911-11-11 11:23:45.123456' − '2021-12-12 12:12:12.654321'::timestamp,结果(整数)由 MICROSECOND 给出。

select timestampdiff ('MICROSECOND', '1911-11-11 11:23:45.123456'::timestamp, '2021-12-12 12:12:12.654321'::timestamp);
  timestampdiff   
------------------
3474060507530865
(1 row)

select timestampdiff (MICROSECOND, '1911-11-11 11:23:45.123456'::timestamp, '2021-12-12 12:12:12.654321'::timestamp);
timestampdiff
------------------
3474060507530865
(1 row)
    

9.32.3.14. TO_DAYS

描述

返回将日期参数转换为天数的结果。

语法

to_days(p_date timestamp) RETURNS bigint
to_days(p_date timestamptz) RETURNS bigint
to_days( p_date text) RETURNS bigint
to_days( p_date text, p_format text) RETURNS bigint
to_days(p_date bigint) RETURNS bigint
    

一般规则

  • 给定一个日期 date,返回一个日期编号(自公元 0 年以来的天数)。

  • TO_DAYS() 不适用于格里高利历实行之前的日期(1582年),因为它没有考虑到更改日历时丢失的天数。对于 1582 年之前(以及其他地区可能的更晚年份)的日期,此函数的结果不可靠。

示例

在以下示例中,返回将日期参数 '1111-11-11' 转换为 406098 天的结果。

select to_days('1111-11-11');
to_days 
---------
  406098
(1 row)
    

9.32.3.15. TO_SECONDS

描述

返回将日期或日期时间参数转换为自公元 0 年以来的秒数。

语法

to_seconds(p_date timestamp) RETURNS bigint
to_seconds(p_date timestamptz) RETURNS bigint
    

一般规则

  • 给定日期或日期时间表达式 expr,返回自公元 0 年以来的秒数。如果 expr 不是有效的日期或日期时间值,则返回 NULL。

  • 与 TO_DAYS() 一样,TO_SECONDS() 不适用于格里高利历实行之前的日期(1582年),因为它没有考虑到更改日历时丢失的天数。对于 1582 年之前(以及其他地区可能的更晚年份)的日期,此函数的结果不可靠。

示例

在以下示例中,返回将日期或日期时间参数 '2009-11-29' 转换为自公元 0 年以来的秒数 63426672000 的结果。

select to_seconds('2009-11-29'::timestamp);
to_seconds  
-------------
63426672000
(1 row)
    

9.32.3.16. UNIX_TIMESTAMP

描述

返回根据时间格式的 UNIX 时间戳。

语法

UNIX_TIMESTAMP() RETURN int8
UNIX_TIMESTAMP(expr1 timestamptz) RETURN int8
UNIX_TIMESTAMP(expr1 text) RETURN int8
    

一般规则

  • 根据 expr1 参数的时间格式返回 UNIX 时间戳。如果没有参数,则返回当前 UNIX 时间戳。

  • expr1 参数至少包含完整的日志格式,例如 20200101。

示例

在下面的示例中,返回对应参数20200101的Unix时间戳“1577808000”。

select unix_timestamp(20200101);
  unix_timestamp 
----------------
      1577808000
(1 row)
select unix_timestamp();
  unix_timestamp 
----------------
      1663051334
(1 row)
    

9.32.3.17. WEEKOFYEAR

描述

根据时间返回当年的周数。

语法

WEEKOFYEAR(expr1 timestamptz) RETURN int4
WEEKOFYEAR(expr1 text) RETURN int4
    

一般规则

  • 根据时间表达式参数expr1,返回当年的周数。

  • 至少包括完整的时间格式,例如20200202、200202。不支持少于6位的参数。

示例

在下面的示例中,返回“36”,因为“20220910”是一年中的第36周。

select weekofyear('20220910');
  weekofyear 
------------
          36
(1 row)
    

9.32.3.18. YEAR

描述

返回日期的年份。

语法

YEAR(expr1 timestamptz) RETURN int4
YEAR(expr1 text) RETURN int4
    

一般规则

  • 返回根据expr1参数日期计算出的年份。

  • 支持完整的年、月、日时间参数,例如“20200101”和“200101”。不支持仅包括月和日参数,例如“0101”和“0704”。

示例

在下面的示例中,返回“2020”,因为“20200101”的年份是2020。

select year(20200101);
  year 
------
  2020
(1 row)
select year('200101');
  year 
------
  2020
(1 row)
    

9.32.3.19. QUARTER

描述

返回日期代表的季度,数字范围为1 ~ 4。

语法

QUARTER(timestamp) RETURN int4
    

一般规则

  • 如果日期为 NULL 则返回 NULL

  • 现在只支持timestamp(也即datetime) 类型和任何能隐式转换为timestamp的入参

示例

在下面的例子中,因为日期是'20201001',即10月,所以返回第4季度。

 select quarter(cast('20201001'as date));
 quarter 
---------
       4
(1 row)

select quarter(cast('20201001'as datetime));
 quarter 
---------
       4
(1 row)

select quarter('20201001');
 quarter 
---------
       4
(1 row)

    

9.32.3.20. LAST_DAY

描述

返回参数所在月份的最后一天的日期值

语法

LAST_DAY(date) RETURN date
LAST_DAY(text) RETURN date
    

一般规则

  • 如果参数为NULL,则返回null

  • 如果参数不可用,则报错

  • 目前只支持date,text 类型(包括任何可以隐式转换到date, text的类型)

示例

在下面的例子中,如果参数可用,参数所在月份的最后一天的日期值被返回:

lightdb@test_m=# SELECT LAST_DAY('2003-02-05');
  last_day  
------------
 2003-02-28
(1 row)

lightdb@test_m=# SELECT LAST_DAY('2004-02-05');
  last_day  
------------
 2004-02-29
(1 row)

lightdb@test_m=# SELECT LAST_DAY('2004-01-01 01:01:01');
  last_day  
------------
 2004-01-31
(1 row)

lightdb@test_m=# SELECT LAST_DAY('2003-03-32');
ERROR:  date/time field value out of range: "2003-03-32"
HINT:  Perhaps you need a different "datestyle" setting.
CONTEXT:  SQL function "last_day" statement 1
lightdb@test_m=# 
    

9.32.3.21. CURDATE

描述

以 'YYYY-MM-DD' 格式返回当前日期.

语法

CURDATE() RETURN date
    

一般规则

  • 目前不能像mysql 一样返回 YYYYMMDD 格式,因此不支持对返回结果进行乘法或除法, 且对返回值的加法减法结果与mysql不同。 Mysql 会根据函数使用的上下文是字符串还是数字上下文,来返回 'YYYY-MM-DD' 或 YYYYMMDD 格式的日期。

示例

lightdb@test_m=# select curdate();
  curdate   
------------
 2023-12-06
(1 row)

lightdb@test_m=# select curdate()+1;
  ?column?  
------------
 2023-12-07
(1 row)

lightdb@test_m=# select curdate()/2;
ERROR:  operator does not exist: date / integer
LINE 1: select curdate()/2;
                        ^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.
lightdb@test_m=# select curdate()*2;
ERROR:  operator does not exist: date * integer
LINE 1: select curdate()*2;
                        ^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.
lightdb@test_m=# select curdate()-2;
  ?column?  
------------
 2023-12-04
(1 row)

    

9.32.4. JSON Functions

提供了如下 JSON 函数:

  • JSON_ARRAY

  • JSON_OBJECT

  • JSON_EXTRACT

  • JSON_CONTAINS

  • JSON_CONTAINS_PATH

  • JSON_PRETTY

  • JSON_REMOVE

  • JSON_INSERT

  • JSON_REPLACE

  • JSON_SET

9.32.4.1. JSON_ARRAY

描述

计算列表中的每个值(列表可能为空),返回包含这些值的 JSON 数组。

语法

JSON_ARRAY( VARIADIC "any" ) RETURNS jsonb
        

一般规则

  • 返回 JSON 数组,数据类型为 jsonb

示例

SELECT JSON_ARRAY(1, 'abc', NULL, TRUE, NOW());
                         json_array                         
------------------------------------------------------------
 [1, "abc", null, true, "2023-05-31T19:44:44.881055+08:00"]
(1 row)
        

9.32.4.2. JSON_OBJECT

描述

计算列表中的每个键值对(列表可能为空),返回包含这些键值对的 JSON 数组。

语法

JSON_OBJECT( VARIADIC "any" ) RETURNS jsonb
      

一般规则

  • 返回 JSON 对象,数据类型为 jsonb

  • 如果键的值为 NULL 或参数个数为奇数,则提示错误。

示例

SELECT JSON_OBJECT('id', 87, 'name', 'carrot');
         json_object          
------------------------------
 {"id": 87, "name": "carrot"}
(1 row)

SELECT JSON_OBJECT('id', 87, 'name', 'carrot', 'id', 99);
         json_object          
------------------------------
 {"id": 99, "name": "carrot"}
(1 row)
        

9.32.4.3. JSON_EXTRACT

描述

通过 JSON 路径从 JSON 文档中选择匹配的数据,并返回。

语法

JSON_EXTRACT(json_doc jsonb, path jsonpath) RETURNS jsonb
        

一般规则

  • 返回所有通过 JSON 路径选择出的值,数据类型为 jsonb。 如果返回的值有多个,则这些值会按选择的顺序构成一个数组。否则返回单个值。

  • 如果任意参数为 NULL,或者 JSON 未选中,则返回 NULL。

  • 如果 JSON 文档或 JSON 路径是非法的值,则提示错误。

示例

SELECT JSON_EXTRACT('{"k1":11,"k2":22,"k2 2":33}','$.k1');
 json_extract 
--------------
 11
(1 row)

SELECT JSON_EXTRACT('{"k1":11,"k2":22,"k2 2":33}','$."k2 2"');
 json_extract 
--------------
 33
(1 row)

SELECT JSON_EXTRACT('{"a":{"c":20, "d":{"b":{"b":30, "c":40}, "e":{"b":50}}}, "c":{"b":60, "c":70}, "b":80}','$.a.c');
 json_extract 
--------------
 20
(1 row)

SELECT JSON_EXTRACT('[10,"str", null, true]','$[1]');
 json_extract 
--------------
 "str"
(1 row)    
SELECT JSON_EXTRACT('[10,"str", null, true]','$[last]');
 json_extract 
--------------
 true
(1 row)

SELECT JSON_EXTRACT('[10,"str", null, true]','$[last-2]');
 json_extract 
--------------
 "str"
(1 row)
        

以下的示例中,有多个值匹配,所以返回的是数组。

SELECT JSON_EXTRACT('[10,"str", null, true]','$[1 to 3]');
    json_extract     
---------------------
 ["str", null, true]
(1 row)

SELECT JSON_EXTRACT('[10,"str", null, true]','$[*]');
      json_extract       
-------------------------
 [10, "str", null, true]
(1 row)

SELECT JSON_EXTRACT('[10]','$[*]');
 json_extract 
--------------
 [10]
(1 row)

SELECT JSON_EXTRACT('{"k1":1,"k2":"22","k2 2":[3,33]}','$.*');
    json_extract    
--------------------
 [1, "22", [3, 33]]
(1 row)
        

9.32.4.4. JSON_CONTAINS

描述

判断 JSON 文档是否包含指定的 JSON 路径,返回 true 或 false。

语法

JSON_CONTAINS(json_doc jsonb, json_val jsonb, path jsonpath) RETURNS bool
        

一般规则

  • 如果任意参数为 NULL,或者 JSON 未选中,则返回 NULL。

  • 如果 JSON 文档或 JSON 路径是非法的值,则提示错误。

  • 如果为了检测某个值是否存在于 JSON 文档中,请使用 JSON_CONTAINS_PATH()。

示例

SELECT JSON_CONTAINS('{"a": 111, "b": 222, "c": {"d": 4444}}', '111', '$.a');
 json_contains 
---------------
 t
(1 row)

SELECT JSON_CONTAINS('{"a": "111", "b": 222, "c": {"d": 4444}}', '111', '$.a');
 json_contains 
---------------
 f
(1 row)

SELECT JSON_CONTAINS('{"a": "111", "b": 222, "c": {"d": 4444}}', '" 111"', '$.a');
 json_contains 
---------------
 f
(1 row)

SELECT JSON_CONTAINS('{"a": 111, "b": 222, "c": {"d": 4444}}', '{"d" :   4444 }', '$.c');
 json_contains 
---------------
 t
(1 row)
        

9.32.4.5. JSON_CONTAINS_PATH

描述

判断 JSON 文档是否包含指定的一个或多个 JSON 路径,返回 true 或 false。

语法

JSON_CONTAINS_PATH(json_doc jsonb, one_or_all text, variadic jsonpath[]) RETURNS bool
        

一般规则

  • 如果 JSON 路径均不存在,则返回 false。否则根据 one_or_all 参数确定返回值:

    • 'one' : 如果任意一个 JSON 路径存在,则返回 true。否则 false。

    • 'all' : 如果所有的 JSON 路径都存在,则返回 true。否则 false。

  • 如果 JSON 文档或 JSON 路径是非法的值或 one_or_all 参数不是 'one' 或 'all',则提示错误。

  • 如果为了检测某个路径是否存在于 JSON 文档中,请使用 JSON_CONTAINS()。

示例

SELECT JSON_CONTAINS_PATH('{"a": 111, "b": 222, "c": {"d": 4444}}', 'one', '$.a', '$.z');
 json_contains_path 
--------------------
 t
(1 row)

SELECT JSON_CONTAINS_PATH('{"a": 111, "b": 222, "c": {"d": 4444}}', 'one', '$.d');
 json_contains_path 
--------------------
 f
(1 row)


SELECT JSON_CONTAINS_PATH('{"a": 111, "b": 222, "c": {"d": 4444}}', 'all', '$a', '$.b', '$.c');
 json_contains_path 
--------------------
 t
(1 row)

SELECT JSON_CONTAINS_PATH('{"a": 111, "b": 222, "c": {"d": 4444}}', 'all', '$a', '$.b', '$.d');
 json_contains_path 
--------------------
 f
(1 row)
        

9.32.4.6. JSON_PRETTY

描述

格式化 JSON 文档。

语法

JSON_PRETTY(json_doc jsonb) RETURNS text
        

一般规则

  • 返回值类型为 text

  • 无意义的空格和换行符不会影响输出结果。

  • 对于参数为 NULL,则函数返回 NULL。如果参数是非法值,则提示错误。

示例

SELECT JSON_PRETTY('{"a":{"b":{"z":1},"c":[5,{"z":2}],"z":3}, "z":4}');
      json_pretty       
------------------------
 {                     +
     "a": {            +
         "b": {        +
             "z": 1    +
         },            +
         "c": [        +
             5,        +
             {         +
                 "z": 2+
             }         +
         ],            +
         "z": 3        +
     },                +
     "z": 4            +
 }
(1 row)
        

9.32.4.7. JSON_REMOVE

描述

从 JSON 文档中删除数据,返回修改后的结果。

语法

JSON_REMOVE(jsonb, jsonpath) RETURNS jsonb
        

一般规则

  • 从 JSON 文档中删除数据,返回修改后的结果。 如果任意参数为 NULL,则返回 NULL。

  • 如果 JSON 文档是非法的值,或 JSON 路径是非法的值,或 JSON 路径为 $, 或 JSON 路径包含 * 或 ** 通配符,则提示错误。

  • 如果指定的 JSON 路径不存在,函数不会提示错误,而是直接返回原 JSON 文档;

示例

SELECT JSON_REMOVE('{"a": 1, "b": [1,2,3], "c": {"d": 4}}', '$.c.d');
            json_remove            
-----------------------------------
 {"a": 1, "b": [1, 2, 3], "c": {}}
(1 row)

SELECT JSON_REMOVE('{"a": 1, "b": [1,2,3], "c": {"d": 4}}', '$.b[last]');
             json_remove              
--------------------------------------
 {"a": 1, "b": [1, 2], "c": {"d": 4}}
(1 row)

SELECT JSON_REMOVE('{"a": 1, "b": [1,2,3], "c": {"d": 4}}', '$.c.z');
               json_remove               
-----------------------------------------
 {"a": 1, "b": [1, 2, 3], "c": {"d": 4}}
(1 row)
        

和 MySQL 不同的时,在通过句号 . 访问 JSON 对象时, 如果未使用双引号将对象名称引起来,并且该名称是合法的 ECMAScript 标识符名,但包含了部分特殊字符(比如 $),LightDB 会提示错误。

SELECT JSON_REMOVE('{"a": 1, "b": [1,2,3], "c": {"d": 4}}', '$.$z');
        

9.32.4.8. JSON_INSERT

描述

向 JSON 文档中插入数据,返回修改后的结果。

语法

JSON_INSERT(jsonb, jsonpath, anyelement) RETURNS jsonb
JSON_INSERT(jsonb, jsonpath, text) RETURNS jsonb
        

一般规则

  • 向 JSON 文档中插入数据,返回修改后的结果。 如果任意参数为 NULL,则返回 NULL。

  • 如果 JSON 文档是非法的值,或 JSON 路径是非法的值, 或 JSON 路径包含 * 或 ** 通配符,则提示错误。

  • 如果 JSON 路径存在,则该函数什么也不做,直接返回原值。 否则先插入数据并返回修改后的结果。

示例

SELECT JSON_INSERT('{ "a": 1, "b": [2, 3]}', '$.a', 10);
      json_insert      
-----------------------
 {"a": 1, "b": [2, 3]}
(1 row)

SELECT JSON_INSERT('{ "a": 1, "b": [2, 3]}', '$.c', 200);
           json_insert           
---------------------------------
 {"a": 1, "b": [2, 3], "c": 200}
(1 row)
        

9.32.4.9. JSON_REPLACE

描述

替换 JSON 文档的数据,返回修改后的结果。

语法

JSON_REPLACE(jsonb, jsonpath, anyelement) RETURNS jsonb
JSON_REPLACE(jsonb, jsonpath, text) RETURNS jsonb
        

一般规则

  • 替换 JSON 文档的数据,返回修改后的结果。 如果任意参数为 NULL,则返回 NULL。

  • 如果 JSON 文档是非法的值,或 JSON 路径是非法的值, 或 JSON 路径包含 * 或 ** 通配符,则提示错误。

  • 如果 JSON 路径不存在,则该函数什么也不做,直接返回原值。 否则先替换数据并返回修改后的结果。

示例

SELECT JSON_REPLACE('{ "a": 1, "b": [2, 3]}', '$.a', 10);
      json_replace      
------------------------
 {"a": 10, "b": [2, 3]}
(1 row)

SELECT JSON_REPLACE('{ "a": 1, "b": [2, 3]}', '$.c', 'null');
        json_replace        
----------------------------
 {"a": 1, "b": [2, 3]}
(1 row)

SELECT JSON_REPLACE('100', '$','{ "a": 1, "b": [2, 3]}'::jsonb);
     json_replace      
-----------------------
 {"a": 1, "b": [2, 3]}
(1 row)
      

和 MySQL 不同的时,在通过句号 . 访问 JSON 对象时, 如果未使用双引号将对象名称引起来,并且该名称是非法的 ECMAScript 标识符名,LightDB 不会提示错误而是返回原值。

SELECT JSON_REPLACE('{ "a": 1, "b": [2, 3]}', '$.b.2z', 4);
     json_replace      
-----------------------
 {"a": 1, "b": [2, 3]}
(1 row)
      

9.32.4.10. JSON_SET

描述

向 JSON 文档中插入数据或替换 JSON 文档的数据,返回修改后的结果。

语法

JSON_SET(jsonb, jsonpath, anyelement) RETURNS jsonb
JSON_SET(jsonb, jsonpath, text) RETURNS jsonb
        

一般规则

  • 向 JSON 文档中插入数据或替换 JSON 文档的数据,返回修改后的结果。 如果任意参数为 NULL,则返回 NULL。

  • 如果 JSON 文档是非法的值,或 JSON 路径是非法的值, 或 JSON 路径包含 * 或 ** 通配符,则提示错误。

  • 如果 JSON 路径存在,先替换数据并返回修改后的结果。 如果 JSON 路径不存在,则先插入数据并返回修改后的结果。

示例

SELECT JSON_SET('{ "a": 1, "b": [2, 3]}', '$.a', 10);
        json_set        
------------------------
 {"a": 10, "b": [2, 3]}
(1 row)

SELECT JSON_SET('{ "a": 1, "b": [2, 3]}', '$.c', '[true, false]');
                  json_set                   
---------------------------------------------
 {"a": 1, "b": [2, 3], "c": "[true, false]"}
(1 row)

SELECT JSON_SET('{ "a": 1, "b": [2, 3]}', '$.b.z', 4);
       json_set        
-----------------------
 {"a": 1, "b": [2, 3]}
(1 row)
        

9.32.5. 条件表达式

支持以下用于进行比较的函数:

  • IF

9.32.5.1. IF

描述

如果expr1为TRUE,则IF()返回expr2。否则,返回expr3。

语法

IF(expr1,expr2,expr3)
        

一般规则

  • 如果expr2或expr3仅有一个明确为NULL,则IF()函数的结果类型为“text”。

  • 如果expr2和expr3中有一个是字符串,则IF()函数的结果类型为“text”,否则为“numeric”。

  • expr2和expr3可以使用以下数据类型:

    • CHAR

    • VARCHAR

    • TEXT

    • INTEGER

    • BIGINT

    • SMALLINT

    • NUMERIC

    • REAL

    • DOUBLE PRECISION

    • BOOLEAN

    • TIMESTAMPTZ

示例

在以下示例中,返回3,因为1 > 2的值为false。

SELECT IF(1>2,2,3);
  if
----
  3
(1 row)
        

9.32.6. 聚合函数

以下聚合函数得到支持:

  • ANY_VALUE

  • GROUP_CONCAT

9.32.6.1. ANY_VALUE

描述

为了与MySQL模式兼容,仅在BY模式下的分组行为语法。

语法

          ANY_VALUE(anyelement)
        

通用规则

  • 此函数对于启用ONLY_FULL_GROUP_BY SQL模式的MySQL兼容GROUP BY查询非常有用,对于MySQL拒绝您知道有效的查询的情况,因为MySQL无法确定,任何值函数将返回导致歧义的第一行。函数返回值和类型与其参数的返回值和类型相同。

    请注意,此行为仅是与MySQL兼容的非标准语法。它用于确保在LightDB中的执行不会报告错误,但无法保证结果与MySQL完全一致。不建议使用此功能。请使用标准语法格式。

示例

在以下示例中,如果id是一个非索引列,则以下查询将失败:

select co1, co2, max(co3) from t1 group by id;
ERROR:  column "t1.co1" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select co1, co2, max(co3) from t1 group by id;
              ^
      

使用ANY_VALUE()来引用co1和co2:

select any_value(co1) as co1, any_value(co2) as co2, max(co3) from t1 group by id;
co1 | co2 | max 
-----+-----+-----
  6 |   9 |  30
  4 |   5 |   5
  3 |   3 |   4
  2 |   3 |   4
(4 rows)
      

9.32.6.2. GROUP_CONCAT

描述

返回字符串值的连接,以分隔符为分隔符。

语法

GROUP_CONCAT( [DISTINCT] column_name1 [ORDER BY {unsigned_integer | column_name2 | expr} [ASC | DESC] [SEPARATOR delimiter TEXT]) returns TEXT
      

通用规则

  • 此函数从组中返回一个具有连接的非NULL值的字符串结果。

  • 如果没有非NULL值,则返回NULL。

  • 要对结果中的值进行排序,请使用ORDER BY子句。要按相反的顺序排序,请在ORDER BY子句中按排序列的名称添加DESC(降序)关键字。默认为升序。可以使用ASC关键字明确指定。

  • 要消除重复值,请使用DISTINCT子句。

  • 默认情况下,组中值之间的分隔符是逗号(,)。要明确指定分隔符,请使用SEPARATOR后跟应在组值之间插入的字符串文字值。要完全消除分隔符,请指定SEPARATOR''。

示例

在以下示例中,返回以':'为分隔符的表t中列col1的值的结果。

select GROUP_CONCAT(col1 separator ':') from (values('BBBB',1),('AAAA',1),('CCCC',2)) as t(col1 ,col2) group by col2;
group_concat
--------------
BBBB:AAAA
CCCC
(2 rows)
      

9.32.7. 系统信息函数和运算符

支持以下系统信息函数:

  • 数据库

9.32.7.1. 数据库

描述

同current_schema()的同义词。在MySQL中,模式的概念类似于数据库。您可以通过设置search_path来指定当前模式。

语法

DATABASE() returns TEXT
      

一般规则

  • 返回搜索路径中第一个模式的名称(如果搜索路径为空,则返回空值)。

  • 与MySQL类似,这是创建没有指定目标模式的任何表或其他命名对象时将使用的模式。

示例

在下面的示例中,当前模式为lightdb。

select database();
  database 
----------
  lighdb
(1 row)
      

9.32.8. 杂项函数

支持以下杂项函数:

  • BIN_TO_UUID

  • COMPRESS

  • UNCOMPRESS

  • UUID

  • UUID_TO_BIN

9.32.8.1. BIN_TO_UUID

描述

将二进制UUID转换为字符串。

语法

bin_to_uuid(p_uuid bytea, swap_flag int4 default 0) RETURNS uuid
    

一般规则

  • BIN_TO_UUID()是UUID_TO_BIN()的反函数。它将二进制UUID转换为字符串UUID并返回结果。二进制值应为VARBINARY(16)值的UUID。

  • 返回值是由连字符分隔的五个十六进制数字组成的utf8字符串。(有关此格式的详细信息,请参见UUID()函数描述。)如果UUID参数为NULL,则返回值为NULL。如果任何参数无效,则会发生错误。

示例

在下面的示例中,将二进制UUID“\x0768a47dd355372b4926ee668b6cb443”转换为字符串“0768a47d-d355-372b-4926-ee668b6cb443”。

select bin_to_uuid('\x0768a47dd355372b4926ee668b6cb443');
            bin_to_uuid              
--------------------------------------
0768a47d-d355-372b-4926-ee668b6cb443
(1 row)
    

9.32.8.2. COMPRESS

描述

压缩字符串并返回二进制数据。

语法

COMPRESS(expr1 text) RETURN bytea
    

一般规则

  • 压缩字符串参数expr1并返回二进制数据。相应的解压函数是UNCOMPRESS。

示例

在以下示例中,将'abc123'压缩为二进制数据'\x06000000616263313233'。

select compress('abc123');
        compress        
------------------------
  \x06000000616263313233
(1 row)
    

9.32.8.3. UNCOMPRESS

描述

解压由compress()函数压缩的二进制数据,并恢复原始字符串。

语法

UNCOMPRESS(expr1 bytea) RETURN text
    

通用规则

  • 解压由compress()函数压缩的二进制数据expr1参数,并恢复原始字符串。

示例

在以下示例中,将二进制数据'\x06000000616263313233'解压为bCompress 'abc123'。

select uncompress(compress('abc123'));
  uncompress 
------------
  abc123
(1 row)
    

9.32.8.4. UUID

Description

生成一个36字节的uuid字符串

Syntax

      uuid() RETURNS text
    

General rules

  • UUID()返回一个符合RFC 4122 版本4中描述的UUID的值。 结果是一个128位整数,以五个十六进制数字组成的字符串格式呈现。

Example

以下示例生成一个uuid字符串

select uuid();
                 uuid                 
--------------------------------------
 f31f29e5-481f-4666-aa74-8cee3aa44545
(1 row)

    

9.32.8.5. UUID_TO_BIN

描述

将字符串UUID转换为二进制。

语法

uuid_to_bin(p_uuid uuid, swap_flag int4 default 0) RETURNS bytea
    

通用规则

  • 将字符串UUID转换为二进制UUID并返回结果。(IS_UUID()函数说明列出了允许的字符串UUID格式。)

  • 返回的二进制UUID是VARBINARY(16)值。如果UUID参数为NULL,则返回值为NULL。如果任何参数无效,则会出现错误。

示例

在以下示例中,将字符串UUID '0768a47d-d355-372b-4926-ee668b6cb443'转换为二进制'\x0768a47dd355372b4926ee668b6cb443'。

select uuid_to_bin('0768a47d-d355-372b-4926-ee668b6cb443'::uuid)::text;
            uuid_to_bin             
------------------------------------
\x0768a47dd355372b4926ee668b6cb443
(1 row)
    

9.32.9. 运算符

支持以下运算符:

  • IFNULL

  • ISNULL

9.32.9.1. IFNULL

描述

根据参数是否为空,返回相应的值。

语法

IFNULL(expr1 anycompatible, expr2 anycompatible) RETURNS anycompatible
IFNULL(expr1 text, expr2 text) RETURNS text
    

通用规则

  • 判断第一个参数是否为null。如果为null,则返回第二个参数的值。如果不为null,则返回第一个参数的值。

  • 两个输入参数必须属于相同的类别,并且可以确定 pg_type typcategory 字段。

示例

在以下示例中,当第一个参数为null时,返回第二个参数15。否则,返回第一个参数1。

select ifnull(1, 15);
  ifnull 
--------
      1
(1 row)
select ifnull(null, 15);
  ifnull 
--------
      15
(1 row)
    

9.32.9.2. ISNULL

描述

测试参数是否为NULL。

语法

isnull(text) RETURNS bool
isnull(numeric) RETURNS bool
isnull(timestamptz) RETURNS bool
    

通用规则

  • 如果expr为NULL,ISNULL()返回true,否则返回false。

例子

在下面的例子中,expr不为NULL,ISNULL()返回false。

select isnull(0)::text;
isnull 
--------
false
(1 row)
    

9.32.10. 算术运算符

支持以下算术运算符:

  • /

9.32.10.1. /

描述

除法运算符。被零除会产生一个NULL结果,报告一个警告日志。

例子

除法运算符示例。被零除会产生一个NULL结果,报告一个警告日志。

select 2 / 4;
  ?column?        
------------------------
 0.50000000000000000000
(1 row)

select 1.0 / 2;
  ?column?        
------------------------
 0.50000000000000000000
(1 row)

select 2 / 0;
WARNING:  division by zero
 ?column? 
----------
         
(1 row)
    

9.32.11. 比较操作符

支持如下比较操作符:

  • =

  • !=

9.32.11.1.  =

描述

等于操作符,支持varchar与bool或text。相等返回true,不相等返回false。

示例

select '1'::varchar = true;
?column?
----------
  t
(1 row)

select '1'::varchar = '1'::text;
?column?
----------
  t
(1 row)

create table a(b varchar(5), c int);
insert into a values(true, 1);
insert into a values('true', 2);

select * from a;
  b   | c
------+---
 1    | 1
 true | 2
(2 rows)

select * from a where b = true;
 b | c
---+---
 1 | 1
(1 row)

select * from a where b = 'true';
  b   | c
------+---
 true | 2
(1 row)

9.32.11.2.  !=

描述

不等于操作符,支持varchar与bool或text。不相等返回true,相等返回false。

示例

select '1' != true;
?column?
----------
  f
(1 row)

select '1'::varchar != '1'::text;
?column?
----------
  f
(1 row)

create table a(b varchar(5), c int);
insert into a values(true, 1);
insert into a values('true', 2);

select * from a;
  b   | c
------+---
 1    | 1
 true | 2
(2 rows)

select * from a where b != true;
  b   | c
------+---
 true | 2
(1 row)

select * from a where b != 'true';
 b | c
---+---
 1 | 1
(1 row)

9.32.12.  类型转换

9.32.12.1.  转换bool类型至varchar

描述

此前,bool类型转换为varchar形式上保持不变,如true转换成'true'或false转换成'false'。Myfce改变上述规则,与mysql兼容,转换bool类型true至字符串'1'及false至字符串'0'。

示例

create table tb (a varchar(5), b int);      
insert into tb values('true', 2);		      -- 插入字符串'true',与期望一致
insert into tb values(true, 1);           -- 插入布尔类型true,而期望插入字符串'1'
insert into tb values(1, 3);			        -- 插入数值1,而期望插入字符串'1'
insert into tb values('1', 4);			      -- 插入字符串'1',与期望一致
insert into tb values(false, 5);			    -- 插入布尔类型false,而期望插入字符串'0'
insert into tb values('false', 6);		    -- 插入字符串'false',与期望一致
insert into tb values(0, 7);			        -- 插入数值0,而期望插入字符串'0'
insert into tb values('0', 8);			      -- 插入字符串'0',与期望一致
select * from tb;
a   | b
-------+---
 true  | 2
 1     | 1
 1     | 3
 1     | 4
 0     | 5
 false | 6
 0     | 7
 0     | 8
(8 rows)

9.32.12.2.  cast(expr as unsigned)

描述

转换expr表达式为unsigned bigint 值.

通用规则

  • 返回类型与mysql不同,LightDB 为 numeric, mysql 为 unsigned bigint.

  • 表达式不能为日期/时间类型(mysql 支持)。具体见示例。

  • 字符串格式的浮点型不会被截断,这与mysql不同,mysql会截断,如'1.9' 会被截断为1。具体见示例。

  • 负浮点型常量不会被截断,这与mysql5.7不同,mysql5.7会截断(mysql8.0不会),如-1.9 会被截断为0(但mysql中浮点型字段中存负数,转换时不会被截断)。具体见示例。

  • 负数在溢出的时候会被截断为 9223372036854775808,这与mysql8.0相同(mysql5.7会截断为0)。具体见示例。

  • 支持转换科学计数法格式的字符串到unsigned, 如:'2e2' 转为200(mysql 不支持,转换后为2)。具体见示例。

示例

lightdb@test_m=# select cast(123 as unsigned) as unsigned;
 unsigned 
----------
      123
(1 row)

lightdb@test_m=# select cast(-123 as unsigned) as unsigned;
       unsigned       
----------------------
 18446744073709551493
(1 row)

lightdb@test_m=# select cast(18446744073709551615 as unsigned) as unsigned;
       unsigned       
----------------------
 18446744073709551615
(1 row)

lightdb@test_m=# select cast(18446744073709551616 as unsigned) as unsigned;
WARNING:  unsigned bigint out of range, Truncated
       unsigned       
----------------------
 18446744073709551615
(1 row)

lightdb@test_m=# select cast(-9223372036854775808 as unsigned) as unsigned;
      unsigned       
---------------------
 9223372036854775808
(1 row)

-- mysql5.7为 0 ,mysql8.0: 9223372036854775808
lightdb@test_m=# select cast(-9223372036854775809 as unsigned) as unsigned;
WARNING:  unsigned bigint out of range, Truncated
      unsigned       
---------------------
 9223372036854775808
(1 row)

lightdb@test_m=# select cast(1.4 as unsigned) as unsigned;
 unsigned 
----------
        1
(1 row)

lightdb@test_m=# select cast(1.5 as unsigned) as unsigned;
 unsigned 
----------
        2
(1 row)

lightdb@test_m=# select cast(1.9 as unsigned) as unsigned;
 unsigned 
----------
        2
(1 row)

-- mysql5.7为 0 ,mysql8.0: 18446744073709551614
lightdb@test_m=# select cast(-1.9 as unsigned) as unsigned;
       unsigned       
----------------------
 18446744073709551614
(1 row)

-- mysql5.7为 0 ,mysql8.0: 18446744073709551614
lightdb@test_m=# select cast(-1.5 as unsigned) as unsigned;
       unsigned       
----------------------
 18446744073709551614
(1 row)

-- mysql5.7为 0 ,mysql8.0: 18446744073709551615
lightdb@test_m=# select cast(-1.4 as unsigned) as unsigned;
       unsigned       
----------------------
 18446744073709551615
(1 row)

-- mysql: 1
lightdb@test_m=# select cast('1.4' as unsigned) as unsigned;
 unsigned 
----------
        1
(1 row)

-- mysql: 1
lightdb@test_m=# select cast('1.5' as unsigned) as unsigned;
 unsigned 
----------
        2
(1 row)

-- mysql: 1
lightdb@test_m=# select cast('1.9' as unsigned) as unsigned;
 unsigned 
----------
        2
(1 row)

-- mysql: 18446744073709551615
lightdb@test_m=# select cast('-1.4' as unsigned) as unsigned;
       unsigned       
----------------------
 18446744073709551615
(1 row)

-- mysql: 18446744073709551615
lightdb@test_m=# select cast('-1.5' as unsigned) as unsigned;
       unsigned       
----------------------
 18446744073709551614
(1 row)

-- mysql: 18446744073709551615
lightdb@test_m=# select cast('-1.9' as unsigned) as unsigned;
       unsigned       
----------------------
 18446744073709551614
(1 row)

lightdb@test_m=# select cast(2e2 as unsigned) as unsigned;
 unsigned 
----------
      200
(1 row)

lightdb@test_m=# select cast('2e2' as unsigned) as unsigned;
 unsigned 
----------
      200
(1 row)

lightdb@test_m=# create table test_c(key1 float4);
CREATE TABLE
lightdb@test_m=# insert into test_c values('-1.6');
INSERT 0 1
lightdb@test_m=# insert into test_c values('-1.4');
INSERT 0 1
lightdb@test_m=# insert into test_c values('-1.5');
INSERT 0 1
lightdb@test_m=# select cast(key1 as unsigned) , key1 from test_c;
   numeric2unsigned   | key1 
----------------------+------
 18446744073709551614 | -1.6
 18446744073709551615 | -1.4
 18446744073709551614 | -1.5
(3 rows)

lightdb@test_m=# select cast(cast('20121212' as date) as unsigned);
ERROR:  cannot cast type date to numeric
LINE 1: select cast(cast('20121212' as date) as unsigned);
               ^
lightdb@test_m=# 

9.32.13. AES加解密

支持下列AES加解密和十六进制转换操作。

  • hex

  • unhex

  • aes_encrypt

  • aes_decrypt

9.32.13.1.  hex

描述

hex函数将bytea类型数据转成text类型。

语法

hex(data bytea) returns text
    

示例

select hex('\x0123456789abcdef');
       hex        
------------------
 0123456789abcdef
(1 row)

9.32.13.2.  unhex

描述

unhex函数将varchar类型数据转成bytea类型。

语法

unhex(data varchar) returns bytea
    

示例

select unhex('0123456789abcdef');
       unhex        
--------------------
 \x0123456789abcdef
(1 row)

9.32.13.3.  aes_encrypt

描述

AES加密函数。

语法

aes_encrypt(data bytea, key bytea) returns bytea
aes_encrypt(data varchar, key varchar) returns bytea
    

示例

select aes_encrypt('world', '123456');
            aes_encrypt             
------------------------------------
 \x85400d3bbeeeb51259f497fcb4bee03e
(1 row)

9.32.13.4.  aes_decrypt

描述

AES解密函数。

语法

aes_decrypt(data bytea, key bytea) returns bytea
aes_decrypt(data varchar, key varchar) returns bytea
aes_decrypt(data bytea, key varchar) returns bytea
    

示例

select aes_decrypt(aes_encrypt('world', '123456'), '123456');
 aes_decrypt  
--------------
 \x776f726c64
(1 row)