4.2. 内置函数

本节主要介绍统一SQL支持原生Oracle数据库中的函数

4.2.1. 数字函数

4.2.1.1. ABS

语法
ABS(numeric_expression)
描述
该函数返回 numeric_expression 的绝对值。ABS 将负值更改为正值,对零或正值没有影响。

参数解释

参数

说明

numeric_expression

精确数值或近似数值数据类型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)的表达式

示例

-- 转换前Oracle SQL:
SELECT ABS(-1.0), ABS(0), ABS(6.66), ABS(3-6) FROM DUAL;
ABS(-1.0)|ABS(0)|ABS(6.66)|ABS(3-6)|
---------+------+---------+--------+
     1|     0|     6.66|       3|


-- 转换后LightDB-Oracle SQL:
SELECT ABS(-1.0),ABS(0),ABS(6.66),ABS(3-6) FROM DUAL
abs|abs|abs |abs|
---+---+----+---+
1.0|  0|6.66|  3|

4.2.1.2. BITAND

语法
BITAND (expr1,expr2)
描述
该函数将其输入参数进行二进制按位与操作

参数解释

参数

说明

expr1

参数1

NUMBER 类型表达式

expr2

参数2

NUMBER 类型表达式

示例

-- 转换前Oracle SQL:
SELECT BITAND(0,0),BITAND(0,-1),BITAND(0,NULL),BITAND(1,2) FROM DUAL;
BITAND(0,0)|BITAND(0,-1)|BITAND(0,NULL)|BITAND(1,2)|
-----------+------------+--------------+-----------+
          0|           0|              |          0|

-- 转换后LightDB-Oracle SQL:
SELECT BITAND(0, 0),BITAND(0, -1),BITAND(0, NULL),BITAND(1, 2) FROM DUAL
bitand|bitand|bitand|bitand|
------+------+------+------+
     0|     0|      |     0|

4.2.1.3. CEIL

语法
CEIL (numeric_expression)
描述
该函数返回大于等于 numeric_expression 的最小整数

参数解释

参数

说明

numeric_expression

精确数值或近似数值数据类型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)的表达式

示例

-- 转换前Oracle SQL:
SELECT CEIL(-1.5),CEIL(1.5),CEIL(2),CEIL(6-9.5) FROM DUAL;
CEIL(-1.5)|CEIL(1.5)|CEIL(2)|CEIL(6-9.5)|
----------+---------+-------+-----------+
        -1|        2|      2|         -3|

-- 转换后LightDB-Oracle SQL:
SELECT CEIL(-1.5),CEIL(1.5),CEIL(2),CEIL(6-9.5) FROM DUAL
ceil|ceil|ceil|ceil|
----+----+----+----+
  -1|   2| 2.0|  -3|

4.2.1.4. DBMS_RANDOM.VALUE

语法
DBMS_RANDOM.VALUE
描述
随机生成 [0,1) 范围内的数字,精度为 38 位

示例

-- 转换前Oracle SQL:
 SELECT DBMS_RANDOM.VALUE from dual;
 VALUE                                   |
----------------------------------------+
0.90603062118926722027812535155007101231|

-- 转换后LightDB-Oracle SQL:
SELECT DBMS_RANDOM.VALUE FROM DUAL
value              |
-------------------+
0.39212693460285664|

4.2.1.5. DBMS_RANDOM.RANDOM

语法
DBMS_RANDOM.RANDOM
描述
随机生成 [-2^31,2^31)范围内的整数。
-- 转换前Oracle SQL:
 SELECT DBMS_RANDOM.RANDOM from dual;
 RANDOM    |
 ----------+
 -886930169|

-- 转换后LightDB-Oracle SQL:
SELECT DBMS_RANDOM.RANDOM FROM DUAL
random    |
----------+
-720293376|

4.2.1.6. EXP

语法
EXP (numeric_expression)
描述
该函数是以自然常数 e 为底的指数函数,用于返回 e 的 numeric_expression 次方,其中 e = 2.71828183…。

参数解释

参数

说明

numeric_expression

是数值数据类型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)或可以隐式转换为数值数据类型的参数

示例

-- 转换前Oracle SQL:
SELECT EXP(1),EXP(0),EXP(NULL),EXP(2) FROM DUAL;
EXP(1)                                  |EXP(0)|EXP(NULL)|EXP(2)                                 |
----------------------------------------+------+---------+---------------------------------------+
2.71828182845904523536028747135266249776|     1|         |7.3890560989306502272304274605750078132|


-- 转换后LightDB-Oracle SQL:
SELECT EXP(1),EXP(0),EXP(NULL),EXP(2) FROM DUAL
exp              |exp|exp|exp             |
-----------------+---+---+----------------+
2.718281828459045|1.0|   |7.38905609893065|

4.2.1.7. FLOOR

语法
FLOOR (numeric_expression)
描述
该函数返回小于等于数值 numeric_expression 的最大整数。

参数解释

参数

说明

numeric_expression

是数值数据类型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)或可以隐式转换为数值数据类型的参数

示例

-- 转换前Oracle SQL:
SELECT floor(0) AS "floor(0)",floor(10) AS "floor(10)",floor(10.11) AS "floor(10.11)",floor(-10.11) AS "floor(-10.11)" from dual;
floor(0)|floor(10)|floor(10.11)|floor(-10.11)|
--------+---------+------------+-------------+
      0|       10|          10|          -11|

-- 转换后LightDB-Oracle SQL:
SELECT floor(0) AS "floor(0)",floor(10) AS "floor(10)",floor(10.11) AS "floor(10.11)",floor(-10.11) AS "floor(-10.11)" FROM dual
floor(0)|floor(10)|floor(10.11)|floor(-10.11)|
--------+---------+------------+-------------+
     0.0|     10.0|          10|          -11|

4.2.1.8. LN

语法
LN (numeric_expression)
描述
该函数返回以 e 为底 numeric_expression 的对数。

参数解释

参数

说明

numeric_expression

是数值数据类型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)或可以隐式转换为数值数据类型的参数

示例

-- 转换前Oracle SQL:
SELECT LN(3.0) AS "Natural Logarithm" from dual;
Natural Logarithm                       |
----------------------------------------+
1.09861228866810969139524523692252570465|

-- 转换后LightDB-Oracle SQL:
SELECT LN(3.0) AS "Natural Logarithm" from dual;
Natural Logarithm |
------------------+
1.0986122886681097|

4.2.1.9. LOG

语法
LOG (x,y)
描述
该函数返回以 x 为底的 y 的对数。

参数解释

参数

说明

x

表示对数的底,数值型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)表达式。 x 大于 0 且不等于 1

y

表示真数,数值型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)表达式。 y 大于 0。

警告

如示例所示,该函数的结果可能存在不一致的情况。

示例

-- 转换前Oracle SQL:
SELECT LOG(10,100),LOG(3,27) AS "LOG3",LOG(2,1024) AS "LOG(2,1024)" from dual;
LOG(10,100)|LOG3                                    |LOG(2,1024)                             |
-----------+----------------------------------------+----------------------------------------+
          2|2.99999999999999999999999999999999999998|9.99999999999999999999999999999999999995|

-- 转换后LightDB-Oracle SQL:
SELECT LOG(10, 100),LOG(3, 27) AS "LOG3",LOG(2, 1024) AS "LOG(2,1024)" FROM dual
log               |LOG3              |LOG(2,1024)        |
------------------+------------------+-------------------+
2.0000000000000000|3.0000000000000000|10.0000000000000000|

4.2.1.10. MOD

语法
MOD (x,y)
描述
该函数是一个求余函数,即是两个数值表达式作除法运算后的余数。返回结果的符号与被除数的符号相同。

参数解释

参数

说明

x

表示被除数,属于数值型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)表达式。

y

表示除数,属于数值型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)表达式。

示例

-- 转换前Oracle SQL:
SELECT MOD(11,4) "Modulus",MOD(11,4),MOD(11,-4),MOD(-11,4),MOD(-11,-4) FROM DUAL;
Modulus  | mod | mod | mod | mod
---------+-----+-----+-----+-----
       3 |   3 |   3 |  -3 |  -3

-- 转换后LightDB-Oracle SQL:
SELECT MOD(11, 4) AS "Modulus",MOD(11, 4),MOD(11, -4),MOD(-11, 4),MOD(-11, -4) FROM DUAL
Modulus|mod|mod|mod|mod|
-------+---+---+---+---+
      3|  3|  3| -3| -3|

4.2.1.11. POWER

语法
POWER (x, y)
描述
该函数作用是返回指定数字的乘幂。

参数解释

参数

说明

x

表示底数,属于数值类型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)表达式

y

表示指数,属于数值类型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)表达式。如果 x 是负数,则 y 必须是整数。

示例

-- 转换前Oracle SQL:
select power(2,3),POWER(3,2) "Raised" from dual;
POWER(2,3)|Raised|
----------+------+
         8|     9|

-- 转换后LightDB-Oracle SQL:
SELECT power(2, 3),POWER(3, 2) AS "Raised" FROM dual
power|Raised|
-----+------+
8.0|   9.0|

4.2.1.12. SIGN

语法
SIGN(numeric_expression)
描述
该函数返回输入数值的符号。符号为 1、-1 和 0。

参数解释

参数

说明

numeric_expression

是数值数据类型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)或可以隐式转换为数值数据类型的参数。

示例

-- 转换前Oracle SQL:
select sign(20),SIGN(0),SIGN(-1),SIGN(-15) AS "sign" from dual;
sign  | sign | sign | sign
------+------+------+------
    1 |    0 |   -1 |   -1

-- 转换后LightDB-Oracle SQL:
SELECT sign(20),SIGN(0),SIGN(-1),SIGN(-15) AS "sign" FROM dual
sign|sign|sign|sign|
----+----+----+----+
 1.0| 0.0|-1.0|-1.0|

4.2.1.13. SQRT

语法
SQRT(numeric_expression)
描述
该函数返回参数 numeric_expression 的平方根。

参数解释

参数

说明

numeric_expression

是数值数据类型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)或可以隐式转换为数值数据类型的参数。

示例

-- 转换前Oracle SQL:
SELECT sqrt(20),sqrt(0),sqrt(1),sqrt(2),sqrt(NULL) FROM DUAL;
SQRT(20)                                |SQRT(0)|SQRT(1)|SQRT(2)                                 |SQRT(NULL)|
----------------------------------------+-------+-------+----------------------------------------+----------+
4.47213595499957939281834733746255247088|      0|      1|1.41421356237309504880168872420969807857|          |


-- 转换后LightDB-Oracle SQL:
SELECT sqrt(20),sqrt(0),sqrt(1),sqrt(2),sqrt(NULL) FROM DUAL
sqrt            |sqrt|sqrt|sqrt              |sqrt|
----------------+----+----+------------------+----+
4.47213595499958| 0.0| 1.0|1.4142135623730951|    |

4.2.1.14. ROUND

语法
ROUND (numeric[,decimal])
描述
该函数返回参数 numeric 四舍五入后的值。

参数解释

参数

说明

numeric

数值类型的(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)表达式。

y

如果 decimal 大于等于 0 则将 numeric 四舍五入到 decimal 位小数。如果 decimal 小于 0 则四舍五入到小数点向左第 decimal 位。当 decimal 不为整数时,截取 decimal 的整数部分。不指定 decimal 时,将 numeric 四舍五入到整数位。

示例

-- 转换前Oracle SQL:
SELECT ROUND(3, 10),ROUND(15.193,1),ROUND(15.193,-1),ROUND(0,10),ROUND(-3,10),ROUND(10) from dual;
ROUND(3,10)|ROUND(15.193,1)|ROUND(15.193,-1)|ROUND(0,10)|ROUND(-3,10)|ROUND(10)|
-----------+---------------+----------------+-----------+------------+---------+
          3|           15.2|              20|          0|          -3|       10|


-- 转换后LightDB-Oracle SQL:
SELECT ROUND(3, 10),ROUND(15.193, 1),ROUND(15.193, -1),ROUND(0, 10),ROUND(-3, 10),ROUND(10) FROM dual
round|round|round|round|round|round|
-----+-----+-----+-----+-----+-----+
   3| 15.2|   20|    0|   -3| 10.0|

4.2.1.15. TRUNC

语法
TRUNC (numeric[,precision])
描述
该函数返回参数 numeric 按精度 precision 截取后的值

参数解释

参数

说明

numeric

表示被截取的数字

precision

表示精度,为可选项,默认值为 0

示例

-- 转换前Oracle SQL:
SELECT TRUNC(555.666,2.2),TRUNC(555.666,-2),TRUNC(555.666) FROM DUAL;
------------------+-----------------+--------------+
TRUNC(555.666,2.2)|TRUNC(555.666,-2)|TRUNC(555.666)|
------------------+-----------------+--------------+
            555.66|              500|           555|


-- 转换后LightDB-Oracle SQL:
SELECT TRUNC(555.666, 2.2),TRUNC(555.666, -2),TRUNC(555.666) FROM DUAL
trunc |trunc|trunc|
------+-----+-----+
555.66|  500|  555|

4.2.2. 字符串函数

4.2.2.1. ASCII

语法
ASCII(str)
描述
该函数返回字符串 str 最左侧字符的 ASCII 码

参数解释

参数

说明

str

字符串.如果 str 为空字符串,则该函数返回 0。如果 str 为 NULL,则该函数返回 NULL

示例

-- 转换前Oracle SQL:
SELECT ASCII('a'),ASCII('ab'),ASCII('d'),ASCII('1'),ASCII(''),ASCII(NULL) FROM DUAL;
+-----------+-----------+------------+------------+-----------------------+
| ASCII('a')| ASCII('ab')| ASCII('d')| ASCII('1')| ASCII('')| ASCII(NULL)|
----------+-----------+----------+----------+---------+-----------+
|        97|         97|       100|        49|        0|           |
+-----------+-----------+------------+------------+-----------------------+

-- 转换后LightDB-Oracle SQL:
SELECT ASCII('a'),ASCII('ab'),ASCII('d'),ASCII('1'),ASCII(''),ASCII(NULL) FROM DUAL
ascii|ascii|ascii|ascii|ascii|ascii|
-----+-----+-----+-----+-----+-----+
   97|   97|  100|   49|     |     |

4.2.2.2. CONCAT

语法
CONCAT(char1,char2)
描述
该函数用于连接两个字符串

参数解释

参数

说明

char1

字符串,字符串类型可为 CHAR、VARCHAR2、NCHAR、NVARCHAR2 或 CLOB

char2

字符串,字符串类型可为 CHAR、VARCHAR2、NCHAR、NVARCHAR2 或 CLOB

示例

-- 转换前Oracle SQL:
SELECT CONCAT('Hello',', world!') FROM DUAL;
CONCAT('HELLO',',WORLD!')|
-------------------------+
Hello, world!            |


SELECT CONCAT('Hello', ', world!') FROM DUAL
concat       |
-------------+
Hello, world!|

4.2.2.3. INSTR

语法
INSTR(str,substr)
描述
返回字符串 str 中子字符串的第一个出现位置

参数解释

参数

说明

str

要操作的字符串

substr

子字符串

示例

-- 转换前Oracle SQL:
SELECT INSTR('Unisql','U') i1,INSTR('Unisql','u') i2,INSTR('Unisql','n') i3,INSTR('Unisql','a') i4,INSTR('Unisql','') i5,INSTR('Unisql',NULL) i6,INSTR('foobarbar', 'bar') i7, INSTR('xbar', 'foobar') i8,INSTR('北京欢迎你','北') i9  FROM DUAL;
--+--+--+--+--+--+--+--+--+
I1|I2|I3|I4|I5|I6|I7|I8|I9|
--+--+--+--+--+--+--+--+--+
1| 0| 2| 0|  |  | 4| 0| 1|


-- 转换后LightDB-Oracle SQL:
SELECT INSTR('Unisql', 'U') AS i1,INSTR('Unisql', 'u') AS i2,INSTR('Unisql', 'n') AS i3,INSTR('Unisql', 'a') AS i4,INSTR('Unisql', '') AS i5,INSTR('Unisql', NULL) AS i6,INSTR('foobarbar', 'bar') AS i7,INSTR('xbar', 'foobar') AS i8,INSTR('▒▒ЙЕ╗ХМГ─с', '▒▒') AS i9 FROM DUAL
i1|i2|i3|i4|i5|i6|i7|i8|i9|
--+--+--+--+--+--+--+--+--+
1| 0| 2| 0|  |  | 4| 0| 1|

4.2.2.4. LOWER

语法
LOWER(char)
描述
该函数将字符串中英文字母全部转为小写

参数解释

参数

说明

char

字符串,字符串类型可为 CHAR、VARCHAR2、NCHAR、NVARCHAR2 或 CLOB

示例

-- 转换前Oracle SQL:
SELECT  LOWER('AaBbCcDd') Lowercase FROM DUAL;
LOWERCASE|
---------+
aabbccdd |


SELECT LOWER('AaBbCcDd') AS Lowercase FROM DUAL
lowercase|
---------+
aabbccdd |

4.2.2.5. LENGTH

语法
LENGTH(str)
描述
该函数返回 str 的字符长度

参数解释

参数

说明

str

要操作的字符串

示例

-- 转换前Oracle SQL:
SELECT LENGTH('中国'), LENGTH('hello') FROM DUAL;
LENGTH('中国')|LENGTH('HELLO')|
------------+---------------+
           2|              5|

-- 转换后LightDB-Oracle SQL:
SELECT LENGTH('中国'),LENGTH('hello') FROM DUAL
length|length|
------+------+
     2|     5|

4.2.2.6. LENGTHB

语法
LENGTHB(str)
描述
该函数返回 str 的字节长度,与字符集的设置有关

参数解释

参数

说明

str

要操作的字符串

示例

-- 转换前Oracle SQL:
SELECT LENGTHB('中国'), LENGTHB('hello') FROM DUAL;
LENGTHB('中国')|LENGTHB('HELLO')|
-------------+----------------+
            6|               5|


-- 转换后LightDB-Oracle SQL:
SELECT LENGTHB('中国'),LENGTHB('hello') FROM DUAL
lengthb|lengthb|
-------+-------+
      6|      5|

4.2.2.7. LTRIM

语法
LTRIM(char,[set])
描述
从 char 的左端删除集合 set 中包含的所有字符

参数解释

参数

说明

char

要操作的字符串

set

要删除的字符集合

示例

-- 转换前Oracle SQL:
SELECT LTRIM(' 2023-09-21 ', ' 0123'),LTRIM('  2023-09-21') FROM DUAL;
--------------------------+-------------------+
LTRIM('2023-09-21','0123')|LTRIM('2023-09-21')|
--------------------------+-------------------+
-09-21                    |2023-09-21         |


-- 转换后LightDB-Oracle SQL:
SELECT LTRIM(' 2023-09-21 ', ' 0123'),LTRIM('  2023-09-21') FROM DUAL
ltrim  |ltrim     |
-------+----------+
-09-21 |2023-09-21|

4.2.2.8. LPAD

语法
LPAD(str,len,padstr)
描述
使用字符串 padstr 从左侧填充字符串 str,直到长度为 len 时为止

参数解释

参数

说明

str

要操作的字符串

len

要填充长度

padstr

要填充的字符串

示例

-- 转换前Oracle SQL:
SELECT
     LPAD('1223', 3),
     LPAD('1223', 4),
     LPAD('1223', 5),
     LPAD('1223', 6, '2+1'),
     LPAD('1223', 7, ''),
     LPAD('1223', 0),
     LPAD('1223',-1)
FROM dual;
LPAD('1223',3)|LPAD('1223',4)|LPAD('1223',5)|LPAD('1223',6,'2+1')|LPAD('1223',7,'')|LPAD('1223',0)|LPAD('1223',-1)|
--------------+--------------+--------------+--------------------+-----------------+--------------+---------------+
122           |1223          | 1223         |2+1223              |                 |              |               |


-- 转换后LightDB-Oracle SQL:
SELECT LPAD('1223', 3),LPAD('1223', 4),LPAD('1223', 5),LPAD('1223', 6, '2+1'),LPAD('1223', 7, ''),LPAD('1223', 0),LPAD('1223', -1) FROM dual
lpad|lpad|lpad |lpad  |lpad|lpad|lpad|
----+----+-----+------+----+----+----+
122 |1223| 1223|2+1223|    |    |    |

4.2.2.9. REPLACE

语法
REPLACE(char1,char2[,char3])
描述
该函数将字符串 char1 中与 char2 匹配的子字符串替换为 char3

参数解释

参数

说明

char1

指定等待替换的字符串。数据类型可以是 CHAR 、VARCHAR2、NCHAR、NVARCHAR2 和 CLOB

char2

指定需要替换的字符串。数据类型可以是 CHAR 、VARCHAR2、NCHAR、NVARCHAR2 和 CLOB

char3

指定替换字符串,默认为空,表示删除,不是空格.说明 如果 char3 缺省或者为 NULL,那么所有 char1 中出现的 char2 都将被移除。如果 char2 为空值,那么结果就是 char1

示例

-- 转换前Oracle SQL:
SELECT REPLACE('unisql','u','U') "replace" FROM DUAL;
replace|
-------+
Unisql |

-- 转换后LightDB-Oracle SQL:
SELECT REPLACE('unisql', 'u', 'U') AS "replace" FROM DUAL
replace|
-------+
Unisql |

4.2.2.10. REVERSE

语法
REVERSE(str)
描述
该函数将字符串进行倒序

参数解释

参数

说明

str

要倒序的字符串

示例

-- 转换前Oracle SQL:
SELECT REVERSE('unIsql') FROM DUAL;
REVERSE('UNISQL')|
-----------------+
lqsInu           |

-- 转换后LightDB-Oracle SQL:
SELECT REVERSE('unIsql') FROM DUAL
reverse|
-------+
lqsInu |

4.2.2.11. REGEXP_INSTR

语法

REGEXP_INSTR (source_char, pattern
             [, position[, occurrence[, return_opt[, match_param[, subexpr] ] ] ] ]
          )
描述
该函数作用是返回正则表达式匹配值在源字符串中的位置

参数解释

参数

说明

source_char

指定用作搜索值的字符表达式,数据类型可为 CHAR、VARCHAR2、NCHAR、NVARCHAR2 或 CLOB。

pattern

指定正则表达式截取规则。它通常是一个文本文字,字符类型可为 CHAR、VARCHAR2、NCHAR 或 NVARCHAR2。

position

指定开始正则表达式匹配的起始位置,取值是一个正整数,为可选项。默认值是 1,表示从第一个字符开始搜索 source_char。

occurrence

指定 source_char 中第几个正则表达式匹配位置,为可选项。默认值为 1。 如果 occurrence 大于 1,则从第一次匹配后的第一个字符开始搜索第二次正则表达式匹配,依此类推。

return_opt

指定返回出现匹配值位置选项,为可选项。默认值为 0。如果指定 0,则返回匹配的第一个字符的位置。如果指定 1,则返回匹配的最后字符后一位的位置。

match_param

指定更改正则表达式默认匹配方式,为可选项。是数据类型 VARCHAR2 或 CHAR 的字符表达式。

subexpr

指示 pattern 要返回的子表达式,是一个从 0 到 9 的非负整数,为可选项。默认值为 0,表示返回第一个子表达式出现的位置。

match_param取值

说明

i

表示大小写不敏感。

c

表示大小写敏感。

n

表示句点 . 可以匹配换行符。

m

表示多行模式。

x

表示忽略空格字符,默认情况下,空格字符会相互匹配。

示例

-- 转换前Oracle SQL:
SELECT
REGEXP_INSTR('http://www.example.com/products','http://([[:alnum:]]+\.?){3,4}/?') "regexp_str",
REGEXP_INSTR('1234567890','(123)(4(56)(78))'),
REGEXP_INSTR('Anderson', 'a|e|i|o|u')
FROM DUAL;
----------+---------------------------------------------+------------------------------------+
regexp_str|REGEXP_INSTR('1234567890','(123)(4(56)(78))')|REGEXP_INSTR('ANDERSON','A|E|I|O|U')|
----------+---------------------------------------------+------------------------------------+
         1|                                            1|                                   4|

-- 转换后LightDB-Oracle SQL:
SELECT REGEXP_INSTR('http://www.example.com/products', 'http://([[:alnum:]]+\.?){3,4}/?') AS "regexp_str",REGEXP_INSTR('1234567890', '(123)(4(56)(78))'),REGEXP_INSTR('Anderson', 'a|e|i|o|u') FROM DUAL
regexp_str|regexp_instr|regexp_instr|
----------+------------+------------+
         1|           1|           4|

4.2.2.12. REGEXP_REPLACE

语法

REGEXP_REPLACE(source_char, pattern
              [, replace_string
                 [, position
                   [, occurrence
                     [, match_param ]
                   ]
                 ]
              ]
            )
描述
该函数将字符串 source_char 中与正则表达式相匹配的字符替换为 replace_string 中的字符。

参数解释

参数

说明

source_char

指定用作搜索值的字符表达式。它通常是一种字符列。数据类型可以是 CHAR、VARCHAR2、NCHAR、NVARCHAR2 或 CLOB 。

pattern

指定正则表达式,它通常是一个文本文字,数据类型可以是 CHAR、VARCHAR2、NCHAR 或 NVARCHAR2。

replace_string

表示替换的字符,可以是 CHAR、VARCHAR2、NCHAR、NVARCHAR2 或 CLOB 类型。

position

指定开始正则表达式匹配的起始位置,取值是一个正整数,为可选项。默认值是 1,表示从第一个字符开始搜索 source_char。

occurrence

指定替换操作的第几个匹配项,是一个非负整数。

match_param

数据类型 VARCHAR2 或 CHAR 的字符表达式,它允许您更改函数的默认匹配行为。

match_param取值

说明

i

表示大小写不敏感。

c

表示大小写敏感。

n

表示句点 . 可以匹配换行符。

m

表示多行模式。

x

表示忽略空格字符,默认情况下,空格字符会相互匹配。

警告

PostgreSQL 最多只支持三个参数。

示例

-- 转换前Oracle SQL:
SELECT REGEXP_REPLACE('china', '(.)', '\1 '),REGEXP_REPLACE('Jane Doe','Jane', 'John'),REGEXP_REPLACE('515.123.4444','([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})','(\1) \2-\3') "REGEXP_REPLACE",REGEXP_REPLACE('500   Oracle     Parkway,    Redwood  Shores, CA','( ){2,}', ' ') FROM DUAL;
REGEXP_REPLACE('CHINA','(.)','\1')|REGEXP_REPLACE('JANEDOE','JANE','JOHN')|REGEXP_REPLACE|REGEXP_REPLACE('500ORACLEPARKWAY,REDWOODSHORES,CA','(){2,}','')|
----------------------------------+---------------------------------------+--------------+---------------------------------------------------------------+
c h i n a                         |John Doe                               |(515) 123-4444|500 Oracle Parkway, Redwood Shores, CA                         |

-- 转换后LightDB-Oracle SQL:
SELECT REGEXP_REPLACE('china', '(.)', '\1 '),REGEXP_REPLACE('Jane Doe', 'Jane', 'John'),REGEXP_REPLACE('515.123.4444', '([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})', '(\1) \2-\3') AS "REGEXP_REPLACE",REGEXP_REPLACE('500   Oracle     Parkway,    Redwood  Shores, CA', '( ){2,}', ' ') FROM DUAL
regexp_replace|regexp_replace|REGEXP_REPLACE|regexp_replace                        |
--------------+--------------+--------------+--------------------------------------+
c h i n a     |John Doe      |(515) 123-4444|500 Oracle Parkway, Redwood Shores, CA|

4.2.2.13. REGEXP_SUBSTR

语法

REGEXP_SUBSTR(source_char, pattern
         [, position [, occurrence ] ])
描述
该函数允许使用正则表达式搜索字符串并返回匹配字符串

参数解释

参数

说明

source_char

指定用作搜索值的字符表达式

pattern

指定正则表达式截取规则。它通常是一个文本字面量

position

指定开始正则表达式匹配的起始位置,取值是一个正整数,为可选项。默认值是 1,表示从第一个字符开始搜索

occurrence

指定 source_char 中第几个正则表达式匹配位置,为可选项。默认值为 1

示例

-- 转换前Oracle SQL:
SELECT regexp_substr('a11a22a33a44', 'a[[:digit:]]+') from dual;
---------------------------------------------+
REGEXP_SUBSTR('A11A22A33A44','A[[:DIGIT:]]+')|
---------------------------------------------+
a11                                          |

-- 转换后LightDB-Oracle SQL:
SELECT regexp_substr('a11a22a33a44', 'a[[:digit:]]+') FROM dual
regexp_substr|
-------------+
a11          |

-- 转换前Oracle SQL:
SELECT regexp_substr('a11a22a33a44', 'a[[:digit:]]+', 1) from dual;
-----------------------------------------------+
REGEXP_SUBSTR('A11A22A33A44','A[[:DIGIT:]]+',1)|
-----------------------------------------------+
a11                                            |

-- 转换后LightDB-Oracle SQL:
SELECT regexp_substr('a11a22a33a44', 'a[[:digit:]]+', 1) FROM dual
regexp_substr|
-------------+
a11          |

-- 转换前Oracle SQL:
SELECT regexp_substr('a11a22a33a44', 'a[[:digit:]]+', 1, 2) FROM DUAL;
-------------------------------------------------+
REGEXP_SUBSTR('A11A22A33A44','A[[:DIGIT:]]+',1,2)|
-------------------------------------------------+
a22                                              |

-- 转换后LightDB-Oracle SQL:
SELECT regexp_substr('a11a22a33a44', 'a[[:digit:]]+', 1, 2) FROM DUAL
regexp_substr|
-------------+
a22          |

4.2.2.14. REGEXP_LIKE condition

语法
REGEXP_LIKE(source_char,pattern)
描述
根据正则表达式进行匹配搜索

参数解释

参数

说明

source_char

是一个字符表达式,可作为搜索值

pattern

正则表达式

示例

-- 建表语句
CREATE TABLE unisql_regexp_like_test(id int,name varchar(50),hiredate varchar(50),salary int);
INSERT INTO unisql_regexp_like_test VALUES(100, 'RAPHAELY', '2017-07-01', 1700);
INSERT INTO unisql_regexp_like_test VALUES(100, 'DE HAAN', '2018-05-01',11000);
INSERT INTO unisql_regexp_like_test VALUES(100, 'ERRAZURIZ', '2017-07-21', 1400);
INSERT INTO unisql_regexp_like_test VALUES(100, 'HARTSTEIN', '2019-05-01',14000);
INSERT INTO unisql_regexp_like_test VALUES(100, 'RAPHAELY', '2017-07-22', 1700);
INSERT INTO unisql_regexp_like_test VALUES(100, 'WEISS',  '2019-07-11',13500);
INSERT INTO unisql_regexp_like_test VALUES(100, 'RUSSELL', '2019-10-05', 13000);
INSERT INTO unisql_regexp_like_test VALUES(100, 'PARTNERS',  '2018-12-01',14000);
INSERT INTO unisql_regexp_like_test VALUES(200, 'ROSS',  '2019-06-11',13500);
INSERT INTO unisql_regexp_like_test VALUES(200, 'BELL', '2019-05-25', 13000);
INSERT INTO unisql_regexp_like_test VALUES(200, 'PART',  '2018-08-11',14000);

-- 转换前Oracle SQL:
SELECT * FROM unisql_regexp_like_test WHERE regexp_like(name, '^R')
ID |NAME    |HIREDATE  |SALARY|
---+--------+----------+------+
100|RAPHAELY|2017-07-01|  1700|
100|RAPHAELY|2017-07-22|  1700|
100|RUSSELL |2019-10-05| 13000|
200|ROSS    |2019-06-11| 13500|


-- 转换后LightDB-Oracle SQL:
SELECT * FROM unisql_regexp_like_test WHERE regexp_like(name, '^R')
id |name    |hiredate  |salary|
---+--------+----------+------+
100|RAPHAELY|2017-07-01|  1700|
100|RAPHAELY|2017-07-22|  1700|
100|RUSSELL |2019-10-05| 13000|
200|ROSS    |2019-06-11| 13500|

4.2.2.15. RPAD

语法
RPAD(str,len,padstr)
描述
使用字符串 padstr 从右侧填充字符串 str,直到长度为 len 时为止

参数解释

参数

说明

str

要操作的字符串

len

要填充长度

padstr

要填充的字符串

示例

-- 转换前Oracle SQL:
SELECT
     RPAD('1223', 3),
     RPAD('1223', 4),
     RPAD('1223', 5),
     RPAD('1223', 6, '2+1'),
     RPAD('1223', 7, ''),
     RPAD('1223', 0),
     RPAD('1223',-1)
FROM dual;
RPAD('1223',3)|RPAD('1223',4)|RPAD('1223',5)|RPAD('1223',6,'2+1')|RPAD('1223',7,'')|RPAD('1223',0)|RPAD('1223',-1)|
--------------+--------------+--------------+--------------------+-----------------+--------------+---------------+
122           |1223          |1223          |12232+              |                 |              |               |


-- 转换后LightDB-Oracle SQL:
SELECT RPAD('1223', 3),RPAD('1223', 4),RPAD('1223', 5),RPAD('1223', 6, '2+1'),RPAD('1223', 7, ''),RPAD('1223', 0),RPAD('1223', -1) FROM dual
rpad|rpad|rpad |rpad  |rpad|rpad|rpad|
----+----+-----+------+----+----+----+
122 |1223|1223 |12232+|    |    |    |

4.2.2.16. RTRIM

语法
RTRIM(char,[set])
描述
从 char 的右端删除集合 set 中包含的所有字符

参数解释

参数

说明

char

要操作的字符串

set

要删除的字符集合

示例

-- 转换前Oracle SQL:
SELECT RTRIM(' 2023-09-21 ', ' 0123'),RTRIM('  2023-09-21') FROM DUAL;
RTRIM('2023-09-21','0123')|RTRIM('2023-09-21')|
--------------------------+-------------------+
2023-09-                 |  2023-09-21       |


-- 转换后LightDB-Oracle SQL:
SELECT RTRIM(' 2023-09-21 ', ' 0123'),RTRIM('  2023-09-21') FROM DUAL
rtrim    |rtrim       |
---------+------------+
2023-09-|  2023-09-21|

4.2.2.17. SUBSTR

语法

SUBSTR(str, pos)
SUBSTR(str, pos, len)
描述
返回 str 的子字符串,起始位置为 pos,长度为 len。参数中包含 NULL 时,返回 NULL

参数解释

参数

说明

str

要操作的字符串

pos

子字符串的起始位置

len

子字符串的长度

示例

-- 转换前Oracle SQL:
SELECT SUBSTR('abcdefg', 3),SUBSTR('abcdefg', 3, 2),SUBSTR('abcdefg', -3),SUBSTR('abcdefg', 3, -2) FROM DUAL;
-------------------+---------------------+--------------------+----------------------+
SUBSTR('ABCDEFG',3)|SUBSTR('ABCDEFG',3,2)|SUBSTR('ABCDEFG',-3)|SUBSTR('ABCDEFG',3,-2)|
-------------------+---------------------+--------------------+----------------------+
cdefg              |cd                   |efg                 |                      |


-- 转换后LightDB-Oracle SQL:
SELECT SUBSTR('abcdefg', 3),SUBSTR('abcdefg', 3, 2),SUBSTR('abcdefg', -3),SUBSTR('abcdefg', 3, -2) FROM DUAL
substr|substr|substr|substr|
------+------+------+------+
cdefg |cd    |efg   |      |

4.2.2.18. TRIM

语法
TRIM([[{BOTH | LEADING | TRAILING}] FROM] str
描述
删除字符串所有前缀和/或后缀,默认为 BOTH。参数中包含 NULL 时,返回 NULL

参数解释

参数

说明

BOTH

删除字符串所有前缀和后缀

LEADING

删除字符串前缀

TRAILING

删除字符串后缀

str

要操作的字符串

示例

-- 转换前Oracle SQL:
SELECT TRIM(' bar '),TRIM(LEADING 'x' FROM 'xxxbarxxx'), TRIM(BOTH 'x' FROM 'xxxbarxxx'),TRIM(TRAILING 'x' FROM 'xxxbarxxx'),TRIM(BOTH 'x' FROM NULL),TRIM(NULL) FROM DUAL;
TRIM('BAR')|TRIM(LEADING'X'FROM'XXXBARXXX')|TRIM(BOTH'X'FROM'XXXBARXXX')|TRIM(TRAILING'X'FROM'XXXBARXXX')|TRIM(BOTH'X'FROMNULL)|TRIM(NULL)|
-----------+-------------------------------+----------------------------+--------------------------------+---------------------+----------+
bar        |barxxx                         |bar                         |xxxbar                          |                     |          |

-- 转换后LightDB-Oracle SQL:
SELECT TRIM(' bar '),TRIM(LEADING 'x' FROM 'xxxbarxxx'),TRIM(BOTH 'x' FROM 'xxxbarxxx'),TRIM(TRAILING 'x' FROM 'xxxbarxxx'),TRIM(BOTH 'x' FROM NULL),TRIM(NULL) FROM DUAL
btrim|ltrim |btrim|rtrim |btrim|btrim|
-----+------+-----+------+-----+-----+
bar  |barxxx|bar  |xxxbar|     |     |

4.2.2.19. UPPER

语法
UPPER(char)
描述
该函数将字符串中英文字母全部转为大写

参数解释

参数

说明

char

要转换的字符串,数据类型可以为 CHAR、VARCHAR2、NCHAR、NVARCHAR2 或 CLOB.

示例

-- 转换前Oracle SQL:
SELECT UPPER('unisql') "UPPER" FROM DUAL;
UPPER |
------+
UNISQL|

-- 转换后LightDB-Oracle SQL:
SELECT UPPER('unisql') AS "UPPER" FROM DUAL
UPPER |
------+
UNISQL|

4.2.3. 时间日期函数

4.2.3.1. ADD_MONTHS

语法
ADD_MONTHS(date, n)
描述
该函数功能是返回日期 date 加上 n 个月后的日期值。

参数解释

参数

说明

date

指定日期。该参数为 DATE 数据类型。

n

整数或可以转换为一个整数的任意值。NUMBER 数据类型。

示例

-- 转换前Oracle SQL:
SELECT
ADD_MONTHS(TO_DATE('2023-12-21','YYYY-MM-DD') ,-3) AS a1,
ADD_MONTHS(TO_DATE('2023-12-21','YYYY-MM-DD'), 3)AS a2,
ADD_MONTHS(TO_DATE('2023-12-21','YYYY-MM-DD'), 1.1)AS a3,
ADD_MONTHS(TO_DATE('2023-12-21','YYYY-MM-DD'), 1.5)AS a4,
ADD_MONTHS(TO_DATE('2023-12-21','YYYY-MM-DD'), 1.8)AS a5,
ADD_MONTHS(TO_DATE('2023-12-21','YYYY-MM-DD'), 0)AS a6
FROM DUAL;
A1                     |A2                     |A3                     |A4                     |A5                     |A6                     |
-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
2023-09-21 00:00:00.000|2024-03-21 00:00:00.000|2024-01-21 00:00:00.000|2024-01-21 00:00:00.000|2024-01-21 00:00:00.000|2023-12-21 00:00:00.000|

-- 转换后LightDB-Oracle SQL:
SELECT ADD_MONTHS(TO_DATE('2023-12-21', 'YYYY-MM-DD'), -3) AS a1,ADD_MONTHS(TO_DATE('2023-12-21', 'YYYY-MM-DD'), 3) AS a2,ADD_MONTHS(TO_DATE('2023-12-21', 'YYYY-MM-DD'), 1.1) AS a3,ADD_MONTHS(TO_DATE('2023-12-21', 'YYYY-MM-DD'), 1.5) AS a4,ADD_MONTHS(TO_DATE('2023-12-21', 'YYYY-MM-DD'), 1.8) AS a5,ADD_MONTHS(TO_DATE('2023-12-21', 'YYYY-MM-DD'), 0) AS a6 FROM DUAL
a1                     |a2                     |a3                     |a4                     |a5                     |a6                     |
-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
2023-09-21 00:00:00.000|2024-03-21 00:00:00.000|2024-01-21 00:00:00.000|2024-02-21 00:00:00.000|2024-02-21 00:00:00.000|2023-12-21 00:00:00.000|

4.2.3.2. CURRENT_DATE

语法
CURRENT_DATE
描述
该函数返回当前会话时区的当前日期

参数解释

示例

-- 转换前Oracle SQL:
SELECT CURRENT_DATE FROM DUAL;
CURRENT_DATE           |
-----------------------+
2023-12-20 09:34:47.000|

-- 转换后LightDB-Oracle SQL:
SELECT localtimestamp(0) FROM DUAL
localtimestamp         |
-----------------------+
2023-12-20 09:29:07.000|

4.2.3.3. CURRENT_TIMESTAMP

语法
CURRENT_TIMESTAMP
描述
该函数返回当前会话时区中的当前日期

参数解释

示例

-- 转换前Oracle SQL:
SELECT CURRENT_TIMESTAMP FROM DUAL;
CURRENT_TIMESTAMP            |
-----------------------------+
2023-12-20 09:36:55.612 +0800|


-- 转换后LightDB-Oracle SQL:
SELECT CURRENT_TIMESTAMP(0) FROM DUAL
current_timestamp      |
-----------------------+
2023-12-20 09:30:35.000|

4.2.3.4. TRUNC(date)

语法
TRUNC(date,[fmt])
描述
该函数返回以参数 fmt 为单位距离的离指定日期 date 最近的日期时间值,并且返回的日期值在 date 之前

参数解释

参数

说明

date

DATE 数据类型

fmt

指定了函数返回值与 date 的距离单位

fmt的取值如下:

fmt 参数的取值

说明

J

默认值,最近 0 点日期。

DAY、DY、D、DDD、DD

返回离指定日期最近的星期日。

MONTH、MON、MM、RM

返回离指定日期最近的月的第一天日期。

Q

返回离指定日期最近的季的日期。

YYYY、YYY、YY、Y

多个 y 表示不同的精度,返回离指定日期最近的年的第一个日期。

CC、SCC

返回离指定日期最近的世纪的初日期。

示例

-- 转换前Oracle SQL:
SELECT TRUNC(TO_DATE('2022/04/19 10:32:34', 'YYYY/MM/DD HH24:MI:SS'), 'YEAR'),TRUNC(TO_DATE('2022/04/19 10:32:34', 'YYYY/MM/DD HH24:MI:SS'), 'MONTH'),TRUNC(TO_DATE('2022/04/19 10:32:34', 'YYYY/MM/DD HH24:MI:SS'), 'DDD')FROM DUAL;
TRUNC(TO_DATE('2022/04/1910:32:34','YYYY/MM/DDHH24:MI:SS'),'YEAR')|TRUNC(TO_DATE('2022/04/1910:32:34','YYYY/MM/DDHH24:MI:SS'),'MONTH')|TRUNC(TO_DATE('2022/04/1910:32:34','YYYY/MM/DDHH24:MI:SS'),'DDD')|
------------------------------------------------------------------+-------------------------------------------------------------------+-----------------------------------------------------------------+
                                           2022-01-01 00:00:00.000|                                            2022-04-01 00:00:00.000|                                          2022-04-19 00:00:00.000|

-- 转换后LightDB-Oracle SQL:
SELECT TRUNC(TO_DATE('2022/04/19 10:32:34', 'YYYY/MM/DD HH24:MI:SS'), 'YEAR'),TRUNC(TO_DATE('2022/04/19 10:32:34', 'YYYY/MM/DD HH24:MI:SS'), 'MONTH'),TRUNC(TO_DATE('2022/04/19 10:32:34', 'YYYY/MM/DD HH24:MI:SS'), 'DDD') FROM DUAL
trunc                  |trunc                  |trunc                  |
-----------------------+-----------------------+-----------------------+
2022-01-01 00:00:00.000|2022-04-01 00:00:00.000|2022-04-19 00:00:00.000|

4.2.3.5. EXTRACT

语法
EXTRACT(unit FROM date)
描述
以整数类型返回 date 的指定部分值

参数解释

参数

说明

date

日期类型参数

示例

-- 转换前Oracle SQL:
SELECT  EXTRACT(HOUR FROM TIMESTAMP '2023-09-06 12:38:40') "HOUR",
            EXTRACT(MINUTE FROM TIMESTAMP '2023-09-06 12:38:40') "MINUTE",
            EXTRACT(SECOND FROM TIMESTAMP '2023-09-06 12:38:40') "SECOND",
            EXTRACT(DAY FROM TIMESTAMP '2023-09-06 12:38:40') "DAY",
            EXTRACT(MONTH FROM TIMESTAMP '2023-09-06 12:38:40') "MONTH",
            EXTRACT(YEAR FROM TIMESTAMP '2023-09-06 12:38:40') "YEAR"
         FROM DUAL;
HOUR|MINUTE|SECOND|DAY|MONTH|YEAR|
----+------+------+---+-----+----+
  12|    38|    40|  6|    9|2023|

-- 转换后LightDB-Oracle SQL:
SELECT EXTRACT(HOUR FROM TIMESTAMP '2023-09-06 12:38:40') AS "HOUR",EXTRACT(MINUTE FROM TIMESTAMP '2023-09-06 12:38:40') AS "MINUTE",EXTRACT(SECOND FROM TIMESTAMP '2023-09-06 12:38:40') AS "SECOND",EXTRACT(DAY FROM TIMESTAMP '2023-09-06 12:38:40') AS "DAY",EXTRACT(MONTH FROM TIMESTAMP '2023-09-06 12:38:40') AS "MONTH",EXTRACT(YEAR FROM TIMESTAMP '2023-09-06 12:38:40') AS "YEAR" FROM DUAL
HOUR|MINUTE|SECOND|DAY|MONTH|YEAR  |
----+------+------+---+-----+------+
12.0|  38.0|  40.0|6.0|  9.0|2023.0|

4.2.3.6. LAST_DAY

语法
LAST_DAY(date)
描述
返回 date 当月最后一天的日期值

参数解释

参数

说明

date

日期类型参数

示例

-- 转换前Oracle SQL:
SELECT LAST_DAY(SYSDATE),LAST_DAY(TO_DATE('2023/09/21','YYYY/MM/DD')) FROM DUAL;
LAST_DAY(SYSDATE)      |LAST_DAY(TO_DATE('2023/09/21','YYYY/MM/DD'))|
-----------------------+--------------------------------------------+
2023-12-31 14:05:54.000|                     2023-09-30 00:00:00.000|


-- 转换后LightDB-Oracle SQL:
SELECT LAST_DAY(sysdate),LAST_DAY(TO_DATE('2023/09/21', 'YYYY/MM/DD')) FROM DUAL
last_day               |last_day               |
-----------------------+-----------------------+
2023-12-31 06:07:14.000|2023-09-30 00:00:00.000|

4.2.3.7. SYSDATE

语法
SYSDATE
描述
返回当前日期和时间
参数解释

示例

-- 转换前Oracle SQL:
SELECT SYSDATE FROM DUAL;
SYSDATE                |
-----------------------+
2023-12-20 09:51:46.000|

-- 转换后LightDB-Oracle SQL:
SELECT sysdate FROM DUAL
sysdate                |
-----------------------+
2023-12-20 01:46:46.000|

4.2.3.8. ROUND(date)

ROUND(date,[fmt])

该函数以参数 fmt 为单位距离返回离指定日期 date 最近的时间值,根据公历的规则运算。

-- 转换前Oracle SQL:
SELECT ROUND(TO_DATE('2023-03-20 12:12:12', 'yyyy-MM-dd hh24:mi:ss'), 'YYYY') AS yyyy,ROUND(TO_DATE('2023-03-20 12:12:12', 'yyyy-MM-dd hh24:mi:ss'), 'Q') AS q,ROUND(TO_DATE('2023-03-20 12:12:12', 'yyyy-MM-dd hh24:mi:ss'), 'MONTH') AS mont,ROUND(TO_DATE('2023-03-20 12:12:12', 'yyyy-MM-dd hh24:mi:ss'), 'DDD') AS ddd,ROUND(TO_DATE('2023-03-20 12:12:12', 'yyyy-MM-dd hh24:mi:ss'), 'HH') AS hh,ROUND(TO_DATE('2023-03-20 12:12:12', 'yyyy-MM-dd hh24:mi:ss'), 'MI') AS mi from dual;
YYYY                   |Q                      |MONT                   |DDD                    |HH                     |MI                     |
-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
2023-01-01 00:00:00.000|2023-04-01 00:00:00.000|2023-04-01 00:00:00.000|2023-03-21 00:00:00.000|2023-03-20 12:00:00.000|2023-03-20 12:12:00.000|

-- 转换后LightDB-Oracle SQL:
SELECT ROUND(TO_DATE('2023-03-20 12:12:12', 'yyyy-MM-dd hh24:mi:ss'), 'YYYY') AS yyyy,ROUND(TO_DATE('2023-03-20 12:12:12', 'yyyy-MM-dd hh24:mi:ss'), 'Q') AS q,ROUND(TO_DATE('2023-03-20 12:12:12', 'yyyy-MM-dd hh24:mi:ss'), 'MONTH') AS mont,ROUND(TO_DATE('2023-03-20 12:12:12', 'yyyy-MM-dd hh24:mi:ss'), 'DDD') AS ddd,ROUND(TO_DATE('2023-03-20 12:12:12', 'yyyy-MM-dd hh24:mi:ss'), 'HH') AS hh,ROUND(TO_DATE('2023-03-20 12:12:12', 'yyyy-MM-dd hh24:mi:ss'), 'MI') AS mi FROM dual
   yyyy                   |q                      |mont                   |ddd                    |hh                     |mi                     |
-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
2023-01-01 00:00:00.000|2023-04-01 00:00:00.000|2023-04-01 00:00:00.000|2023-03-21 00:00:00.000|2023-03-20 12:00:00.000|2023-03-20 12:12:00.000|

4.2.3.9. SYSTIMESTAMP

语法
SYSTIMESTAMP
描述
该函数返回系统当前日期和时间,返回值的秒的小数位包含 3 位精度,包含当前时区信息,依赖于当前数据库服务器所在操作系统的时区
参数解释

示例

-- 转换前Oracle SQL:
SELECT SYSTIMESTAMP,SYSTIMESTAMP(0),SYSTIMESTAMP(1),SYSTIMESTAMP(2),SYSTIMESTAMP(3),SYSTIMESTAMP(4),SYSTIMESTAMP(5),SYSTIMESTAMP(6),SYSTIMESTAMP(7),SYSTIMESTAMP(8),SYSTIMESTAMP(9) FROM DUAL;
SYSTIMESTAMP                 |SYSTIMESTAMP(0)              |SYSTIMESTAMP(1)              |SYSTIMESTAMP(2)              |SYSTIMESTAMP(3)              |SYSTIMESTAMP(4)              |SYSTIMESTAMP(5)              |SYSTIMESTAMP(6)              |SYSTIMESTAMP(7)              |SYSTIMESTAMP(8)              |SYSTIMESTAMP(9)              |
-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+
2023-12-20 09:56:34.932 +0800|2023-12-20 09:56:35.000 +0800|2023-12-20 09:56:34.900 +0800|2023-12-20 09:56:34.930 +0800|2023-12-20 09:56:34.932 +0800|2023-12-20 09:56:34.932 +0800|2023-12-20 09:56:34.932 +0800|2023-12-20 09:56:34.932 +0800|2023-12-20 09:56:34.932 +0800|2023-12-20 09:56:34.932 +0800|2023-12-20 09:56:34.932 +0800|

-- 转换后LightDB-Oracle SQL:
SELECT systimestamp,SYSTIMESTAMP(0),SYSTIMESTAMP(1),SYSTIMESTAMP(2),SYSTIMESTAMP(3),SYSTIMESTAMP(4),SYSTIMESTAMP(5),SYSTIMESTAMP(6),SYSTIMESTAMP(7),SYSTIMESTAMP(8),SYSTIMESTAMP(9) FROM DUAL
systimestamp           |systimestamp           |systimestamp           |systimestamp           |systimestamp           |systimestamp           |systimestamp           |systimestamp           |systimestamp           |systimestamp           |systimestamp           |
-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
2023-12-20 10:50:31.293|2023-12-20 10:50:31.000|2023-12-20 10:50:31.300|2023-12-20 10:50:31.290|2023-12-20 10:50:31.293|2023-12-20 10:50:31.293|2023-12-20 10:50:31.293|2023-12-20 10:50:31.293|2023-12-20 10:50:31.293|2023-12-20 10:50:31.293|2023-12-20 10:50:31.293|

4.2.4. 通用比较函数

4.2.4.1. GREATEST

语法
GREATEST(value1, ...)
描述
返回参数的最大值,和函数 LEAST() 相反

参数解释

参数

说明

value1, …

参数至少为两个(如果只提供一个参数,则会报错)。如果参数中有 NULL,则该函数返回为 NULL

示例

-- 转换前Oracle SQL:
SELECT GREATEST(2,1), GREATEST('2',1,0), GREATEST('a','b','c'), GREATEST('a', NULL, 'c'), GREATEST('2023-05-15','2023-09-06') from dual;
-------------+-----------------+---------------------+----------------------+-----------------------------------+
GREATEST(2,1)|GREATEST('2',1,0)|GREATEST('A','B','C')|GREATEST('A',NULL,'C')|GREATEST('2023-05-15','2023-09-06')|
-------------+-----------------+---------------------+----------------------+-----------------------------------+
            2|2                |c                    |                      |2023-09-06                         |

-- 转换后LightDB-Oracle SQL:
SELECT GREATEST(2, 1),GREATEST('2', 1, 0),GREATEST('a', 'b', 'c'),GREATEST('a', NULL, 'c'),GREATEST('2023-05-15', '2023-09-06') FROM dual
greatest|greatest|greatest|greatest|greatest  |
--------+--------+--------+--------+----------+
       2|2       |c       |        |2023-09-06|

4.2.4.2. LEAST

语法
LEAST(value1, ...)
描述
返回参数的最小值,和 GREATEST() 函数相反

参数解释

参数

说明

value1, …

参数至少为两个;如果参数中有 NULL,返回值为 NULL

示例

-- 转换前Oracle SQL:
SELECT LEAST(2, null), LEAST('2',4,9), LEAST('a','b','c'), LEAST('a',NULL,'c'), LEAST('2014-05-15','2014-06-01') FROM dual;
-------------+--------------+------------------+-------------------+--------------------------------+
LEAST(2,NULL)|LEAST('2',4,9)|LEAST('A','B','C')|LEAST('A',NULL,'C')|LEAST('2014-05-15','2014-06-01')|
-------------+--------------+------------------+-------------------+--------------------------------+
            |2             |a                 |                   |2014-05-15                      |

-- 转换后LightDB-Oracle SQL:
SELECT LEAST(2, NULL),LEAST('2', 4, 9),LEAST('a', 'b', 'c'),LEAST('a', NULL, 'c'),LEAST('2014-05-15', '2014-06-01') FROM dual
least|least|least|least|least     |
-----+-----+-----+-----+----------+
     |2    |a    |     |2014-05-15|

4.2.5. 转换函数

4.2.5.1. CAST

语法
CAST (expr AS type_name )
描述
该函数用于将一种内置数据类型转换为另一种内置数据类型

参数解释

参数

说明

expr

列名或者表达式。

AS

用于分隔两个参数,在 AS 之前的是要处理的数据,在 AS 之后是要转换的数据类型。

type_name

数据库的内建数据类型名称。

下表显示了哪些数据类型可以转换为其他内置数据类型

from BINARY_FLOAT / BINARY_DOUBLE

from CHAR / VARCHAR2

from NUMBER

from DATETIME/INTERVAL

from RAW

from NCHAR/ NVARCHAR2

to BINARY_FLOAT/ BINARY_DOUBLE

yes

yes

yes

no

no

yes

to CHAR/ VARCHAR2

yes

yes

yes

yes

yes

no

to NUMBER

yes

yes

yes

no

no

yes

to DATETIME/INTERVAL

no

yes

no

yes

no

no

to RAW

yes

yes

yes

no

yes

no

to NCHAR/NVARCHAR2

yes

no

yes

yes

yes

yes

警告

使用 CAST 函数转换数据类型时,需要注意以下内容:

  • 对于以上列表中的转换,如果目标库对转换后的目标数据类型不支持,则会在目标库中执行时报错。

  • 注意在转换成RAW类型时,Oracle和LightDB-Oracle的实现有一定的差异,会出现执行结果不一致的情况。

  • 对于类似cast(‘6983140795139873811265107033372908879759234567’ AS number)这种超过38位精度的数字,转换后的SQL在目标库执行会存在报错或者精度错误的情况。

示例

-- 转换前Oracle SQL:
select
cast(123 as BINARY_FLOAT),
cast(123 as BINARY_DOUBLE),
cast(1 as CHAR),
cast(123 as VARCHAR2(10)),
cast('123' as NUMBER),
cast('2023-12-20 10:07:55.222' as TIMESTAMP),
cast('2-6' AS INTERVAL YEAR TO MONTH),
cast('1 10:22:22' AS INTERVAL DAY TO SECOND),
cast('313233' AS RAW(10)),
cast(123 as NCHAR(3)),
cast(123 as NVARCHAR2(3))
from dual;
CAST(123ASBINARY_FLOAT)|CAST(123ASBINARY_DOUBLE)|CAST(1ASCHAR)|CAST(123ASVARCHAR2(10))|CAST('123'ASNUMBER)|CAST('2023-12-2010:07:55.222'ASTIMESTAMP)|CAST('2-6'ASINTERVALYEARTOMONTH)|CAST('110:22:22'ASINTERVALDAYTOSECOND)|CAST('313233'ASRAW(10))|CAST(123ASNCHAR(3))|CAST(123ASNVARCHAR2(3))|
-----------------------+------------------------+-------------+-----------------------+-------------------+-----------------------------------------+--------------------------------+--------------------------------------+-----------------------+-------------------+-----------------------+
                  123.0|                   123.0|1            |123                    |                123|                  2023-12-20 10:07:55.222|2-6                             |1 10:22:22.0                          |123                    |123                |123                    |


-- 转换后LightDB-Oracle SQL:
SELECT CAST(123 AS binary_float),CAST(123 AS binary_double),CAST(1 AS char),CAST(123 AS varchar2(10)),CAST('123' AS number),CAST('2023-12-20 10:07:55.222' AS timestamp),CAST('2-6' AS interval year to month),CAST('1 10:22:22' AS interval day to second(6)),CAST('313233' AS raw(10)),CAST(123 AS nchar(3)),CAST(123 AS nvarchar2(3)) FROM dual
binary_float|binary_double|bpchar|varchar2|numeric|timestamp              |interval                                     |interval                                        |raw   |bpchar|nvarchar2|
------------+-------------+------+--------+-------+-----------------------+---------------------------------------------+------------------------------------------------+------+------+---------+
       123.0|        123.0|1     |123     |    123|2023-12-20 10:07:55.222|2 years 6 mons 0 days 0 hours 0 mins 0.0 secs|0 years 0 mons 1 days 10 hours 22 mins 22.0 secs|313233|123   |123      |


-- 转换前Oracle SQL:
SELECT
     CAST('100.2345' AS NUMBER) AS to_nu,
     CAST('100.2345' AS NUMBER(*)) AS to_nu,
     CAST('100.2345' AS NUMBER(*,0)) AS to_nu,
     CAST('100.2345' AS NUMBER(*,2)) AS to_nu,
     CAST('100.2345' AS NUMBER(4)) AS to_nu,
     CAST('100.2345' AS NUMBER(4,0)) AS to_nu,
     CAST('100.2345' AS NUMBER(9)) AS to_nu,
     CAST('100.2345' AS NUMBER(9,0)) AS to_nu,
     CAST('100.2345' AS NUMBER(18)) AS to_nu,
     CAST('100.2345' AS NUMBER(18,0)) AS to_nu,
     CAST('100.2345' AS NUMBER(38)) AS to_nu,
     CAST('100.2345' AS NUMBER(38,0)) AS to_nu,
     CAST('100.2345' AS NUMBER(10,2)) AS to_nu,
     cast('100.2345' AS decimal) AS to_dec,
     cast('100.2345' AS decimal(*)) AS to_dec,
     cast('100.2345' AS decimal(*,0)) AS to_dec,
     cast('100.2345' AS decimal(*,2)) AS to_dec,
     cast('100.2345' AS decimal(4)) AS to_dec,
     cast('100.2345' AS decimal(4,0)) AS to_dec,
     cast('100.2345' AS decimal(9)) AS to_dec,
     cast('100.2345' AS decimal(9,0)) AS to_dec,
     CAST('100.2345' AS decimal(18)) AS to_dec,
     CAST('100.2345' AS decimal(18,0)) AS to_dec,
     CAST('100.2345' AS decimal(38)) AS to_dec,
     CAST('100.2345' AS decimal(38,0)) AS to_dec,
     CAST('100.2345' AS decimal(10,2)) AS to_dec,
     cast('100.2345' AS dec) AS to_dec,
     cast('100.2345' AS dec(*)) AS to_dec,
     cast('100.2345' AS dec(*,0)) AS to_dec,
     cast('100.2345' AS dec(*,2)) AS to_dec,
     cast('100.2345' AS dec(4)) AS to_dec,
     cast('100.2345' AS dec(4,0)) AS to_dec,
     cast('100.2345' AS dec(9)) AS to_dec,
     cast('100.2345' AS dec(9,0)) AS to_dec,
     CAST('100.2345' AS dec(18)) AS to_dec,
     CAST('100.2345' AS dec(18,0)) AS to_dec,
     CAST('100.2345' AS dec(38)) AS to_dec,
     CAST('100.2345' AS dec(38,0)) AS to_dec,
     CAST('100.2345' AS dec(10,2)) AS to_dec,
     cast('100.2345' AS numeric) AS to_numr,
     cast('100.2345' AS numeric(*)) AS to_numr,
     cast('100.2345' AS numeric(*,0)) AS to_numr,
     cast('100.2345' AS numeric(*,2)) AS to_numr,
     cast('100.2345' AS numeric(4)) AS to_numr,
     cast('100.2345' AS numeric(4,0)) AS to_numr,
     cast('100.2345' AS numeric(9)) AS to_numr,
     cast('100.2345' AS numeric(9,0)) AS to_numr,
     CAST('100.2345' AS numeric(18)) AS to_numr,
     CAST('100.2345' AS numeric(18,0)) AS to_numr,
     CAST('100.2345' AS numeric(38)) AS to_numr,
     CAST('100.2345' AS numeric(38,0)) AS to_numr,
     CAST('100.2345' AS numeric(10,2)) AS to_numr
FROM dual
TO_NU   |TO_NU   |TO_NU|TO_NU |TO_NU|TO_NU|TO_NU|TO_NU|TO_NU|TO_NU|TO_NU|TO_NU|TO_NU |TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_DEC|TO_NUMR|TO_NUMR|TO_NUMR|TO_NUMR|TO_NUMR|TO_NUMR|TO_NUMR|TO_NUMR|TO_NUMR|TO_NUMR|TO_NUMR|TO_NUMR|TO_NUMR|
--------+--------+-----+------+-----+-----+-----+-----+-----+-----+-----+-----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
100.2345|100.2345|  100|100.23|  100|  100|  100|  100|  100|  100|  100|  100|100.23|   100|   100|   100|100.23|   100|   100|   100|   100|   100|   100|   100|   100|100.23|   100|   100|   100|100.23|   100|   100|   100|   100|   100|   100|   100|   100|100.23|    100|    100|    100| 100.23|    100|    100|    100|    100|    100|    100|    100|    100| 100.23|

-- 转换后LightDB-Oracle SQL:
SELECT CAST('100.2345' AS number) AS to_nu,CAST('100.2345' AS number) AS to_nu,CAST('100.2345' AS number(38,0)) AS to_nu,CAST('100.2345' AS number(38,2)) AS to_nu,CAST('100.2345' AS number(4)) AS to_nu,CAST('100.2345' AS number(4)) AS to_nu,CAST('100.2345' AS number(9)) AS to_nu,CAST('100.2345' AS number(9)) AS to_nu,CAST('100.2345' AS number(18)) AS to_nu,CAST('100.2345' AS number(18)) AS to_nu,CAST('100.2345' AS number(38)) AS to_nu,CAST('100.2345' AS number(38)) AS to_nu,CAST('100.2345' AS number(10,2)) AS to_nu,CAST('100.2345' AS decimal(38,0)) AS to_dec,CAST('100.2345' AS decimal(38,0)) AS to_dec,CAST('100.2345' AS decimal(38,0)) AS to_dec,CAST('100.2345' AS decimal(38,2)) AS to_dec,CAST('100.2345' AS decimal(4)) AS to_dec,CAST('100.2345' AS decimal(4)) AS to_dec,CAST('100.2345' AS decimal(9)) AS to_dec,CAST('100.2345' AS decimal(9)) AS to_dec,CAST('100.2345' AS decimal(18)) AS to_dec,CAST('100.2345' AS decimal(18)) AS to_dec,CAST('100.2345' AS decimal(38)) AS to_dec,CAST('100.2345' AS decimal(38)) AS to_dec,CAST('100.2345' AS decimal(10,2)) AS to_dec,CAST('100.2345' AS dec(38,0)) AS to_dec,CAST('100.2345' AS dec(38,0)) AS to_dec,CAST('100.2345' AS dec(38,0)) AS to_dec,CAST('100.2345' AS dec(38,2)) AS to_dec,CAST('100.2345' AS dec(4)) AS to_dec,CAST('100.2345' AS dec(4)) AS to_dec,CAST('100.2345' AS dec(9)) AS to_dec,CAST('100.2345' AS dec(9)) AS to_dec,CAST('100.2345' AS dec(18)) AS to_dec,CAST('100.2345' AS dec(18)) AS to_dec,CAST('100.2345' AS dec(38)) AS to_dec,CAST('100.2345' AS dec(38)) AS to_dec,CAST('100.2345' AS dec(10,2)) AS to_dec,CAST('100.2345' AS numeric(38,0)) AS to_numr,CAST('100.2345' AS numeric(38,0)) AS to_numr,CAST('100.2345' AS numeric(38,0)) AS to_numr,CAST('100.2345' AS numeric(38,2)) AS to_numr,CAST('100.2345' AS numeric(4)) AS to_numr,CAST('100.2345' AS numeric(4)) AS to_numr,CAST('100.2345' AS numeric(9)) AS to_numr,CAST('100.2345' AS numeric(9)) AS to_numr,CAST('100.2345' AS numeric(18)) AS to_numr,CAST('100.2345' AS numeric(18)) AS to_numr,CAST('100.2345' AS numeric(38)) AS to_numr,CAST('100.2345' AS numeric(38)) AS to_numr,CAST('100.2345' AS numeric(10,2)) AS to_numr FROM dual
to_nu   |to_nu   |to_nu|to_nu |to_nu|to_nu|to_nu|to_nu|to_nu|to_nu|to_nu|to_nu|to_nu |to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_dec|to_numr|to_numr|to_numr|to_numr|to_numr|to_numr|to_numr|to_numr|to_numr|to_numr|to_numr|to_numr|to_numr|
--------+--------+-----+------+-----+-----+-----+-----+-----+-----+-----+-----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
100.2345|100.2345|  100|100.23|  100|  100|  100|  100|  100|  100|  100|  100|100.23|   100|   100|   100|100.23|   100|   100|   100|   100|   100|   100|   100|   100|100.23|   100|   100|   100|100.23|   100|   100|   100|   100|   100|   100|   100|   100|100.23|    100|    100|    100| 100.23|    100|    100|    100|    100|    100|    100|    100|    100| 100.23|

4.2.5.2. NUMTODSINTERVAL

语法
NUMTODSINTERVAL(number, 'interval_unit')
描述
该函数作用是将一个数值表达式加时间间隔单位转换为一个 INTERVAL DAY TO SECOND 数据类型的值。可以用来对一个日期时间值进行加减计算。

参数解释

参数

说明

number

指定间隔数量,是一个 NUMBER 值或可以隐式转换为 NUMBER 值的表达式。

interval_unit

指定间隔单位,可以是 CHAR、VARCHAR2、NCHAR 或 NVARCHAR2 数据类型的值,不区分大小写。默认情况下,返回的精度为 9

interval_unit的取值如下:

  • DAY, 表示天。

  • HOUR, 表示小时。

  • MINUTE ,表示分钟。

  • SECOND, 表示秒。

示例

-- 转换前Oracle SQL:
SELECT NUMTODSINTERVAL(10,'day'),
NUMTODSINTERVAL(10,'HOUR'),
NUMTODSINTERVAL(10,'MINUTE'),
NUMTODSINTERVAL(10,'SECOND')
FROM DUAL;
NUMTODSINTERVAL(10,'DAY')|NUMTODSINTERVAL(10,'HOUR')|NUMTODSINTERVAL(10,'MINUTE')|NUMTODSINTERVAL(10,'SECOND')|
-------------------------+--------------------------+----------------------------+----------------------------+
10 0:0:0.0               |0 10:0:0.0                |0 0:10:0.0                  |0 0:0:10.0                  |


-- 转换后LightDB-Oracle SQL:
SELECT NUMTODSINTERVAL(10, 'day'),NUMTODSINTERVAL(10, 'HOUR'),NUMTODSINTERVAL(10, 'MINUTE'),NUMTODSINTERVAL(10, 'SECOND') FROM DUAL
numtodsinterval                               |numtodsinterval                               |numtodsinterval                               |numtodsinterval                               |
----------------------------------------------+----------------------------------------------+----------------------------------------------+----------------------------------------------+
0 years 0 mons 10 days 0 hours 0 mins 0.0 secs|0 years 0 mons 0 days 10 hours 0 mins 0.0 secs|0 years 0 mons 0 days 0 hours 10 mins 0.0 secs|0 years 0 mons 0 days 0 hours 0 mins 10.0 secs|

4.2.5.3. NUMTOYMINTERVAL

语法
NUMTOYMINTERVAL(number, 'interval_unit')
描述
该函数作用是将一个数值表达式加时间间隔单位转换为一个 INTERVAL DAY TO SECOND 数据类型的值。可以用来对一个日期时间值进行加减计算。

参数解释

参数

说明

number

指定间隔数量,是一个 NUMBER 值或可以隐式转换为 NUMBER 值的表达式。

interval_unit

指定间隔单位,可以是 CHAR、VARCHAR2、NCHAR 或 NVARCHAR2 数据类型的值,不区分大小写。默认情况下,返回的精度为 9。 间隔单位:YEAR 表示年。MONTH 表示月。

示例

-- 转换前Oracle SQL:
SELECT NUMTOYMINTERVAL(1,'YEAR'),
NUMTOYMINTERVAL(1,'MONTH'),
SYSDATE+NUMTOYMINTERVAL(1,'YEAR'),
SYSDATE+NUMTOYMINTERVAL(1,'MONTH')
FROM DUAL;
NUMTOYMINTERVAL(1,'YEAR')|NUMTOYMINTERVAL(1,'MONTH')|SYSDATE+NUMTOYMINTERVAL(1,'YEAR')|SYSDATE+NUMTOYMINTERVAL(1,'MONTH')|
-------------------------+--------------------------+---------------------------------+----------------------------------+
1-0                      |0-1                       |          2024-12-20 13:40:28.000|           2024-01-20 13:40:28.000|


-- 转换后LightDB-Oracle SQL:
SELECT NUMTOYMINTERVAL(1, 'YEAR'),NUMTOYMINTERVAL(1, 'MONTH'),sysdate+NUMTOYMINTERVAL(1, 'YEAR'),sysdate+NUMTOYMINTERVAL(1, 'MONTH') FROM DUAL
numtoyminterval                              |numtoyminterval                              |?column?               |?column?               |
---------------------------------------------+---------------------------------------------+-----------------------+-----------------------+
1 years 0 mons 0 days 0 hours 0 mins 0.0 secs|0 years 1 mons 0 days 0 hours 0 mins 0.0 secs|2024-12-21 07:16:53.000|2024-01-21 07:16:53.000|

4.2.5.4. TO_BLOB

语法
TO_BLOB( raw_value )
描述
该函数将 LONG RAW 值和 RAW 值转换为 BLOB 值

参数解释

参数

说明

raw_value

LONG RAW 或 RAW 类型的值

示例

-- create table
CREATE TABLE unisql_test_blob (c1 RAW(100),c2 LONG RAW);

INSERT INTO unisql_test_blob (c1, c2) VALUES (HEXTORAW('FFAABB'), EMPTY_BLOB());
INSERT INTO unisql_test_blob (c1, c2) VALUES (HEXTORAW('112233'), EMPTY_BLOB());

-- 转换前Oracle SQL:
SELECT LENGTH(c1) "LENGTH_RAW",LENGTH(TO_BLOB(c1)) "LENGTH_BLOB" FROM unisql_test_blob
LENGTH_RAW|LENGTH_BLOB|
----------+-----------+
         6|          3|
         6|          3|

-- 转换后LightDB-Oracle SQL:
SELECT LENGTH(c1) AS "LENGTH_RAW",LENGTH(TO_BLOB(c1)) AS "LENGTH_BLOB" FROM unisql_test_blob
LENGTH_RAW|LENGTH_BLOB|
----------+-----------+
         3|          3|
         3|          3|

4.2.5.5. TO_CHAR (character)

语法
TO_CHAR(character)
描述
该函数将 NCHAR、NVARCHAR2 或 CLOB 类型的数据转换为 VARCHAR2 数据类型。

参数解释

参数

说明

character

指定要转换为 VARCHAR2 数据类型表达式,数据类型可以是 NCHAR、NVARCHAR2 或 CLOB

示例

-- 转换前Oracle SQL:
SELECT TO_CHAR('010101') FROM DUAL;
TO_CHAR('010101')|
-----------------+
010101           |


-- 转换后LightDB-Oracle SQL:
SELECT TO_CHAR('010101') FROM DUAL
to_char|
-------+
010101 |

4.2.5.6. TO_CHAR(datetime)

语法
TO_CHAR(datetime [, fmt [, 'nlsparam' ] ])
描述
该函数将一个日期时间或间隔数据转换为一个字符串类型的值,使用指定的格式字符串fmt来格式化输出字符串。

参数解释

参数

说明

datetime

datetime 属于日期时间, DATE、TIMESTAMP数据类型

fmt

指定输出格式

示例

-- 转换前Oracle SQL:
SELECT
TO_CHAR(TO_TIMESTAMP('2023-04-20 17:31:12.66', 'YYYY-MM-DD HH24:MI:SS.FF'),'HH12:MI:SS') AS a1,
TO_CHAR(TO_DATE('2023-04-20', 'YYYY-MM-DD'),'YYYY-MM-DD') AS a2
FROM DUAL;
A1      |A1        |
--------+----------+
05:31:12|2023-04-20|

-- 转换后LightDB-Oracle SQL:
SELECT TO_CHAR(TO_TIMESTAMP('2023-04-20 17:31:12.66', 'YYYY-MM-DD HH24:MI:SS.FF'), 'HH12:MI:SS') AS a1,TO_CHAR(TO_DATE('2023-04-20', 'YYYY-MM-DD'), 'YYYY-MM-DD') AS a2 FROM DUAL
a1      |a2        |
--------+----------+
05:31:12|2023-04-20|

4.2.5.7. TO_CHAR (number)

语法
TO_CHAR(n [, fmt [, 'nlsparam' ] ])
描述
该函数将 NUMBER、BINARY_FLOAT 或 BINARY_DOUBLE 类型的数值按照指定数值格式转换为 varchar2 数据类型的值。

参数解释

参数

说明

n

属于 NUMBER、BINARY_FLOAT 或 BINARY_DOUBLE 数据类型的数值。

fmt

输出格式参数,为可选项。如果省略 fmt,则 n 被转换为 VARCHAR2 值。取值信息请参见 fmt 参数列表。

nlsparam

定义十进制字符、组分隔符、当地货币符号和国际货币符号,为可选项。

fmt参数列表:

fmt 参数取值

说明

9

返回指定位数的值。

0

它返回前导 0,它返回尾随 0。

,(逗号)

返回指定位置的逗号。可以在数字格式模型中指定多个逗号。限制条件 :格式模型数值不能以逗号开头,且逗号不能出现在小数字符或句点的右边。

.(小数点)

返回一个小数,且小数点在指定位置。限制条件 :在数字格式模型中,只能指定一个小数点。

示例

-- 转换前Oracle SQL:
SELECT TO_CHAR(123456789.123,'999,999,999.909') FROM DUAL;
TO_CHAR(123456789.123,'999,999,999.909')|
----------------------------------------+
123,456,789.123                        |

-- 转换后LightDB-Oracle SQL:
SELECT TO_CHAR(123456789.123, '999,999,999.909') FROM DUAL
to_char         |
----------------+
 123,456,789.123|

4.2.5.8. TO_CLOB

语法
TO_CLOB(lob_column | char)
描述
该函数将 LOB 列或其他字符串中的 NCLOB 值转换为 CLOB 值。

参数解释

参数

说明

lob_column

属于 LOB 列或其他字符串中的 NCLOB 值。

char

属于 CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB 或 NCLOB 类型的值。

示例

CREATE TABLE unisql_test_clob (c1 clob,c2 varchar2(10));
INSERT INTO unisql_test_clob VALUES (TO_CLOB('1'),'orale');

-- 转换前Oracle SQL:
SELECT TO_CLOB(c1),TO_CLOB(c2),TO_CLOB(10)  FROM unisql_test_clob;
TO_CLOB(C1)|TO_CLOB(C2)|TO_CLOB(10)|
-----------+-----------+-----------+
1          |orale      |10         |


-- 转换后LightDB-Oracle SQL:
SELECT CAST(c1 AS text),CAST(c2 AS text),CAST(10 AS text) FROM unisql_test_clob
c1|c2   |text|
--+-----+----+
1 |orale|10  |

4.2.5.9. TO_DATE

语法
TO_DATE(char [, fmt])
描述
该函数将 CHAR、VARCHAR、NCHAR 或 NVARCHAR2 数据类型的字符转换为日期数据类型的值

参数解释

参数

说明

char

CHAR、VARCHAR、NCHAR 或 NVARCHAR2 数据类型的值

fmt

指定 char 的时间格式

示例

-- 转换前Oracle SQL:
select to_date('2012/12/12', 'yyyy-MM-dd'),
to_date('2023-12-02', 'yyyy-mm-dd'),
to_date('2023-12-02 11:23:33', 'yyyy-mm-dd HH24:MI:SS')
FROM DUAL;
TO_DATE('2012/12/12','YYYY-MM-DD')|TO_DATE('2023-12-02','YYYY-MM-DD')|TO_DATE('2023-12-0211:23:33','YYYY-MM-DDHH24:MI:SS')|
----------------------------------+----------------------------------+----------------------------------------------------+
           2012-12-12 00:00:00.000|           2023-12-02 00:00:00.000|                             2023-12-02 11:23:33.000|

-- 转换后LightDB-Oracle SQL:
SELECT to_date('2012/12/12', 'yyyy-MM-dd'),to_date('2023-12-02', 'yyyy-mm-dd'),to_date('2023-12-02 11:23:33', 'yyyy-mm-dd HH24:MI:SS') FROM DUAL
to_date                |to_date                |to_date                |
-----------------------+-----------------------+-----------------------+
2012-12-12 00:00:00.000|2023-12-02 00:00:00.000|2023-12-02 11:23:33.000|

4.2.5.10. TO_NUMBER

语法
TO_NUMBER(expr)
描述
该函数功能是将 CHAR、VARCHAR2等类型的字符串转换为 NUMBER 数值数据类型的值

参数解释

参数

说明

expr

属于 CHAR、VARCHAR2、NCHAR、NVARCHAR2、BINARY_FLOAT 或 BINARY_DOUBLE 数据类型的数值。

示例

-- 转换前Oracle SQL:
SELECT TO_NUMBER('0123456'),TO_NUMBER('1.2'),TO_NUMBER('0'),TO_NUMBER(1.2),TO_NUMBER('-1'),TO_NUMBER(-1) FROM DUAL;
TO_NUMBER('0123456')|TO_NUMBER('1.2')|TO_NUMBER('0')|TO_NUMBER(1.2)|TO_NUMBER('-1')|TO_NUMBER(-1)|
--------------------+----------------+--------------+--------------+---------------+-------------+
              123456|             1.2|             0|           1.2|             -1|           -1|

-- 转换后LightDB-Oracle SQL:
SELECT TO_NUMBER('0123456'),TO_NUMBER('1.2'),TO_NUMBER('0'),TO_NUMBER(1.2),TO_NUMBER('-1'),TO_NUMBER(-1) FROM DUAL
to_number|to_number|to_number|to_number|to_number|to_number|
---------+---------+---------+---------+---------+---------+
   123456|      1.2|        0|      1.2|       -1|       -1|

4.2.5.11. TO_TIMESTAMP

语法
TO_TIMESTAMP (char,[fmt])
描述
该函数将字符串转换为 TIMESTAMP 数据类型

参数解释

参数

说明

datetime

datetime 属于日期时间, DATE、TIMESTAMP数据类型

fmt

指定输出格式

示例

-- 转换前Oracle SQL:
SELECT TO_TIMESTAMP ('2023-03-17 14:10:10', 'YYYY-MM-DD HH24:MI:SS') AS t1, to_timestamp('2023-12-20', 'yyyy-mm-dd') AS t2,to_timestamp('2023-12-20 02', 'yyyy-mm-dd hh24') AS t3 FROM DUAL;
T1                     |T2                     |T3                     |
-----------------------+-----------------------+-----------------------+
2023-03-17 14:10:10.000|2023-12-20 00:00:00.000|2023-12-20 02:00:00.000|

-- 转换后LightDB-Oracle SQL:
SELECT TO_TIMESTAMP('2023-03-17 14:10:10', 'YYYY-MM-DD HH24:MI:SS') AS t1,to_timestamp('2023-12-20', 'yyyy-mm-dd') AS t2,to_timestamp('2023-12-20 02', 'yyyy-mm-dd hh24') AS t3 FROM DUAL
t1                     |t2                     |t3                     |
-----------------------+-----------------------+-----------------------+
2023-03-17 14:10:10.000|2023-12-20 00:00:00.000|2023-12-20 02:00:00.000|

4.2.5.12. TO_NCHAR (character)

语法
TO_NCHAR(character)
描述
该函数将 CHAR、VARCHAR2、CLOB 或 NCLOB 类型的数据转换为国家字符集,返回 NVARCHAR2 数据类型。

参数解释

参数

说明

character

CHAR、VARCHAR2、CLOB 或 NCLOB 类型的数据

示例

CREATE TABLE unisql_test_nchar(col1 INT,col2 VARCHAR2(20));
INSERT INTO unisql_test_nchar VALUES(1,'unisql tool');

-- 转换前Oracle SQL:
SELECT TO_NCHAR(col1),TO_NCHAR(col2) FROM unisql_test_nchar;
TO_NCHAR(COL1)|TO_NCHAR(COL2)|
--------------+--------------+
1             |unisql tool   |

-- 转换后LightDB-Oracle SQL:
SELECT CAST(col1 AS text),CAST(col2 AS text) FROM unisql_test_nchar
col1|col2       |
----+-----------+
1   |unisql tool|

4.2.5.13. TO_NCHAR (datetime)

语法
TO_NCHAR({ datetime | interval }[, fmt [, 'nlsparam' ] ])
描述
该函数将 DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE、INTERVAL YEAR TO MONTH 或 INTERVAL DAY TO SECOND 等数据类型的值从数据库字符集转换为国家字符集的数据类型

参数解释

参数

说明

datetime

DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE、INTERVAL DAY TO SECOND 和 INTERVAL YEAR TO MONTH 等数据类型的值。

interval

INTERVAL DAY TO SECOND 和 INTERVAL YEAR TO MONTH 数据类型的值

fmt

指定输出格式

nlsparam

用来控制返回的月份和日份所使用的语言,为可选项。

interval取值

说明

YEAR

表示年。

MONTH

表示月。

DAY

表示天。

HOUR

表示小时。

MINUTE

表示分钟。

SECOND

表示秒数。

4.2.5.14. TO_NCHAR (number)

语法
TO_NCHAR(n)
描述
该函数将 NUMBER、BINARY_FLOAT 或 BINARY_DOUBLE 类型的数值转换为国家字符集中的字符串。

参数解释

参数

说明

n

属于 NUMBER、BINARY_FLOAT 或 BINARY_DOUBLE 数据类型的数值。

示例

-- 转换前Oracle SQL:
SELECT TO_NCHAR(123456789.123) FROM DUAL;
TO_NCHAR(123456789.123)|
-----------------------+
123456789.123          |

-- 转换后LightDB-Oracle SQL:
SELECT CAST(123456789.123 AS text) FROM DUAL
text         |
-------------+
123456789.123|

4.2.5.15. RAWTOHEX

该函数将一个字节数组转换为十六进制字符串。

-- 转换前Oracle SQL:
SELECT RAWTOHEX(SYS_GUID()) FROM DUAL;
RAWTOHEX(SYS_GUID())            |
--------------------------------+
0D003A97D52E7EB7E0632989140A93CC|

-- 转换后LightDB-Oracle SQL:
SELECT replace(SYS_GUID(), '-', '') FROM DUAL
replace                         |
--------------------------------+
874cb2d1c2f24023a5f16d1525043d6b|

4.2.5.16. ROWIDTOCHAR

该函数将 rowid 值转换为 VARCHAR2 数据类型的值 参考示例如下:

CREATE TABLE unisql_rowidtochar_test (
 id NUMBER,
 name VARCHAR(50)
);

INSERT INTO unisql_rowidtochar_test (id, name) VALUES (1, 'Alice');
INSERT INTO unisql_rowidtochar_test (id, name) VALUES (2, 'Bob');

-- 转换前Oracle SQL:
SELECT ROWIDTOCHAR(ROWID) AS char_rowid FROM unisql_rowidtochar_test;
CHAR_ROWID        |
------------------+
AAA2i1AAMAAIbEjAAA|
AAA2i1AAMAAIbEjAAB|

-- 转换后LightDB-Oracle SQL:
SELECT ROWIDTOCHAR(ROWID) AS char_rowid FROM unisql_rowidtochar_test
char_rowid|
----------+
(0,1)     |
(0,2)     |

4.2.6. 编码解码函数

4.2.6.1. DECODE

语法
DECODE (condition, search, result [, search, result ...][, default])
描述
该函数功能是将 condition 与每个 search 依次做比较,并返回对比结果

参数解释

参数

说明

condition

数值数据类型(NUMBER、FLOAT、BINARY_FLOAT 或 BINARY_DOUBLE)或字符数据类型( CHAR、VARCHAR2、NCHAR 或 NVARCHAR2)的值或表达式

search

数值数据类型(NUMBER、FLOAT、BINARY_FLOAT 或 BINARY_DOUBLE)或字符数据类型( CHAR、VARCHAR2、NCHAR 或 NVARCHAR2)的值或表达式

result

数值数据类型(NUMBER、FLOAT、BINARY_FLOAT 或 BINARY_DOUBLE)或字符数据类型( CHAR、VARCHAR2、NCHAR 或 NVARCHAR2)的值或表达式

default

数值数据类型(NUMBER、FLOAT、BINARY_FLOAT 或 BINARY_DOUBLE)或字符数据类型( CHAR、VARCHAR2、NCHAR 或 NVARCHAR2)的值或表达式

示例

-- 转换前Oracle SQL:
SELECT DECODE(SIGN((5*3-2)-(3*4-1)),0,'相等',1,'(5*3-2)大','(3*4-1)大') FROM DUAL;
DECODE(SIGN((5*3-2)-(3*4-1)),0,'相等',1,'(5*3-2)大','(3*4-1)大')|
------------------------------------------------------------+
(5*3-2)大                                                    |

-- 转换后LightDB-Oracle SQL:
SELECT DECODE(SIGN((5*3-2)-(3*4-1)), 0, '相等', 1, '(5*3-2)┤з', '(3*4-1)┤з') FROM DUAL
decode  |
--------+
(5*3-2)大|

4.2.7. 空值函数

4.2.7.1. NVL

语法
NVL(expr1, expr2)
描述
该函数从两个表达式返回一个非空值。如果 expr1 与 expr2 的结果都为空值,则 NVL 函数返回 NULL

参数解释

参数

说明

expr1

指定第一个参数,数据类型可以是数据库内建数据类型中的任何数据类型。

expr2

指定第二个参数,数据类型可以是数据库内建数据类型中的任何数据类型。

示例

-- 转换前Oracle SQL:
SELECT NVL(10,'1'),NVL(NULL,1),NVL(0/1,1) FROM DUAL;
NVL(10,'1')|NVL(NULL,1)|NVL(0/1,1)|
-----------+-----------+----------+
         10|          1|         0|

-- 转换后LightDB-Oracle SQL:
SELECT NVL(10, '1'),NVL(NULL, 1),NVL(0/1, 1) FROM DUAL
nvl|nvl|nvl|
---+---+---+
10|1  |  0|

4.2.7.2. NULLIF

语法
NULLIF(expr1, expr2)
描述
该函数用于比较两个参数表达式是否相等。如果 expr1 与 expr2 相等,则返回 NULL。如果 expr1 与 expr2 不相等,则返回 expr1。

参数解释

参数

说明

expr1

指定第一个参数,可以是任意数据类型的表达式。

expr2

指定第二个参数,如果 expr1 不是数值数据类型,则 expr2 的数据类型必须与 expr1 相同,否则数据库将返回错误。

示例

-- 转换前Oracle SQL:
SELECT NULLIF(3+4,6+1),NULLIF(3+4,6+2),NULLIF('3+4','6+1') FROM DUAL;
NULLIF(3+4,6+1)|NULLIF(3+4,6+2)|NULLIF('3+4','6+1')|
---------------+---------------+-------------------+
               |              7|3+4                |

-- 转换后LightDB-Oracle SQL:
SELECT NULLIF(3+4, 6+1),NULLIF(3+4, 6+2),NULLIF('3+4', '6+1') FROM DUAL
nullif|nullif|nullif|
------+------+------+
      |     7|3+4   |

4.2.7.3. IS NULL

空值比较

-- 转换前Oracle SQL:
SELECT * FROM  unisql_employee WHERE employee_id IS NULL;
EMPLOYEE_ID|NAME|SALARY|DEPARTMENT_ID|HIRE_DATE|COMMISSION_PCT|
-----------+----+------+-------------+---------+--------------+

-- 转换后LightDB-Oracle SQL:
SELECT * FROM unisql_employee WHERE employee_id IS NULL
employee_id|name|salary|department_id|hire_date|commission_pct|
-----------+----+------+-------------+---------+--------------+

4.2.7.4. EMPTY_BLOB, EMPTY_CLOB

empty_blob和empty_clob返回一个空的LOB定位器。空意味着LOB是初始化的,但没有填充数据。

DROP TABLE unisql_blob_test;
CREATE TABLE unisql_blob_test (id number,blob_data blob);

-- 在insert语句中的使用
INSERT INTO unisql_blob_test (id,blob_data) VALUES (1,EMPTY_BLOB());
INSERT INTO unisql_blob_test (id,blob_data) VALUES (2,EMPTY_BLOB());
INSERT INTO unisql_blob_test (id,blob_data) VALUES (3,EMPTY_BLOB());
INSERT INTO unisql_blob_test (id,blob_data) VALUES (3,'blob data');

SELECT * FROM unisql_blob_test;

-- 在update语句中的使用
UPDATE unisql_blob_test SET blob_data = EMPTY_BLOB() WHERE id = 4;

4.2.8. 环境和标识符函数

4.2.8.1. SYS_GUID

语法
SYS_GUID()
描述
该函数生成并返回由 16 个字节组成的全局唯一标识符,即生成一个全局唯一序列号

参数解释

示例

-- 转换前Oracle SQL:
SELECT SYS_GUID() FROM DUAL;
SYS_GUID()      |
----------------+
íx OH xàc)   çt|

-- 转换后LightDB-Oracle SQL:
SELECT SYS_GUID() FROM DUAL;
------------------------------------+
SYS_GUID                            |
------------------------------------+
c0f0d0f9-4ca1-11ee-b63c-78ac443a561e|

4.2.8.2. SYS_CONTEXT

该函数返回当前时刻与上下文命名空间关联的参数的值。

-- 转换前Oracle SQL:
SELECT SYS_CONTEXT ('USERENV', 'SID') FROM DUAL;
SYS_CONTEXT('USERENV','SID')|
----------------------------+
13168                       |

-- 转换后LightDB-Oracle SQL:
SELECT SYS_CONTEXT('USERENV', 'SID') FROM DUAL
sys_context|
-----------+
18337      |

4.2.8.3. USER

语法
USER
描述
返回当前的用户名与主机名
参数解释

示例

-- 转换前Oracle SQL:
SELECT USER FROM DUAL;
USER  |
------+
SYSTEM|

-- 转换后LightDB-Oracle SQL:
SELECT USER FROM DUAL
user   |
-------+
lightdb|

4.2.9. 层次函数

4.2.9.1. SYS_CONNECT_BY_PATH

SYS_CONNECT_BY_PATH(column,'char')

该函数返回从根到节点的列值的路径,由 CONNECT BY 条件返回的每一行的列值用指定分隔符号分隔。

CREATE TABLE unisql_sys_connect_by_path_test(z_id int,name varchar(20),n_id int);
INSERT INTO unisql_sys_connect_by_path_test VALUES(0,'ABC','');
INSERT INTO unisql_sys_connect_by_path_test VALUES(1,'An',0);
INSERT INTO unisql_sys_connect_by_path_test VALUES(2,'Bn',0);
INSERT INTO unisql_sys_connect_by_path_test VALUES(3,'Cn',0);
INSERT INTO unisql_sys_connect_by_path_test VALUES(4,'A1',1);
INSERT INTO unisql_sys_connect_by_path_test VALUES(5,'B1',2);
INSERT INTO unisql_sys_connect_by_path_test VALUES(6,'C1',3);
INSERT INTO unisql_sys_connect_by_path_test VALUES(7,'C2',6);
INSERT INTO unisql_sys_connect_by_path_test VALUES(8,'A2',4);
INSERT INTO unisql_sys_connect_by_path_test VALUES(9,'B2',5);
INSERT INTO unisql_sys_connect_by_path_test VALUES(10,'A3',8);
INSERT INTO unisql_sys_connect_by_path_test VALUES(11,'A4',10);
INSERT INTO unisql_sys_connect_by_path_test VALUES(12,'B3',9);

-- 转换前Oracle SQL:
SELECT z_id,name,n_id,SYS_CONNECT_BY_PATH(name, '/') "Path"
FROM unisql_sys_connect_by_path_test
WHERE n_id in(0,1,2)
START WITH n_id IS NOT NULL
CONNECT BY PRIOR n_id = z_id
ORDER BY z_id;
Z_ID|NAME|N_ID|Path           |
----+----+----+---------------+
   1|An  |   0|/A4/A3/A2/A1/An|
   1|An  |   0|/A2/A1/An      |
   1|An  |   0|/A3/A2/A1/An   |
   1|An  |   0|/A1/An         |
   1|An  |   0|/An            |
   2|Bn  |   0|/B3/B2/B1/Bn   |
   2|Bn  |   0|/B1/Bn         |
   2|Bn  |   0|/B2/B1/Bn      |
   2|Bn  |   0|/Bn            |
   3|Cn  |   0|/C2/C1/Cn      |
   3|Cn  |   0|/C1/Cn         |
   3|Cn  |   0|/Cn            |
   4|A1  |   1|/A3/A2/A1      |
   4|A1  |   1|/A1            |
   4|A1  |   1|/A2/A1         |
   4|A1  |   1|/A4/A3/A2/A1   |
   5|B1  |   2|/B1            |
   5|B1  |   2|/B3/B2/B1      |
   5|B1  |   2|/B2/B1         |

-- 转换后LightDB-Oracle SQL:
SELECT z_id,name,n_id,SYS_CONNECT_BY_PATH(name, '/') AS "Path" FROM unisql_sys_connect_by_path_test WHERE n_id IN (0,1,2) START WITH n_id IS NOT NULL CONNECT BY PRIOR n_id=z_id ORDER BY z_id
z_id|name|n_id|Path           |
----+----+----+---------------+
   1|An  |   0|/An            |
   1|An  |   0|/A1/An         |
   1|An  |   0|/A2/A1/An      |
   1|An  |   0|/A3/A2/A1/An   |
   1|An  |   0|/A4/A3/A2/A1/An|
   2|Bn  |   0|/B1/Bn         |
   2|Bn  |   0|/Bn            |
   2|Bn  |   0|/B3/B2/B1/Bn   |
   2|Bn  |   0|/B2/B1/Bn      |
   3|Cn  |   0|/C1/Cn         |
   3|Cn  |   0|/Cn            |
   3|Cn  |   0|/C2/C1/Cn      |
   4|A1  |   1|/A4/A3/A2/A1   |
   4|A1  |   1|/A2/A1         |
   4|A1  |   1|/A3/A2/A1      |
   4|A1  |   1|/A1            |
   5|B1  |   2|/B2/B1         |
   5|B1  |   2|/B1            |
   5|B1  |   2|/B3/B2/B1      |

4.2.10. 聚合函数

4.2.10.1. AVG

语法
AVG([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]
描述
该函数将数值类型或者可以转换成数值类型的表达式作为参数求平均值。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

DISTINCT 或 ALL

查询时是否去重。为可选项,默认值 ALL。ALL:查询时不去除数据中的重复值,且忽略数据中的 NULL 值。DISTINCT:查询时去除数据中的重复值,且忽略数据中的 NULL 值。

expr

指定要计算的列名。列的数据类型是数值类型或者可以转换成数值类型的表达式。数值类型可以为 NUMBER、FLOAT、BINARY_FLOAT 或 BINARY_DOUBLE。

OVER

使用 OVER 子句定义窗口进行计算

示例

CREATE TABLE unisql_employee(employee_id int,name varchar(30),salary int,department_id int,hire_date varchar(10),commission_pct number);
INSERT INTO unisql_employee values(1,'JACK',5000,1,'2023-01-01',0.05);
INSERT INTO unisql_employee values(2,'TOM',10000,1,'2023-02-01',0.15);
INSERT INTO unisql_employee values(3,'LINDA',15000,1,'2023-03-01',0.20);
INSERT INTO unisql_employee values(4,'ADA',20000,2,'2023-04-01',0.10);
INSERT INTO unisql_employee values(5,'TINA',30000,2,'2023-05-01',0.20);
INSERT INTO unisql_employee values(6,'KATE',50000,3,'2023-06-01',0.30);

-- 转换前Oracle SQL:
SELECT AVG(salary) FROM unisql_employee;
AVG(SALARY)                             |
----------------------------------------+
21666.6666666666666666666666666666666667|

-- 转换后LightDB-Oracle SQL:
SELECT AVG(salary) FROM unisql_employee
avg               |
------------------+
21666.666666666667|

4.2.10.2. CORR

语法
CORR(expr1, expr2) [ OVER (analytic_clause) ]
描述
该函数用于计算一组数值对的相关系数

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

expr1

指定第一个参数,属于数值数据类型或可以隐式转换为数值数据类型的值。

expr2

指定第二个参数,属于数值数据类型或可以隐式转换为数值数据类型的值。

OVER

使用 OVER 子句定义窗口进行计算

示例

CREATE TABLE unisql_students (
   id INT PRIMARY KEY,
   name VARCHAR(50),
   age INTEGER,
   grade INTEGER
);

INSERT INTO unisql_students (id,name, age, grade) VALUES(1,'Alice', 20, 85);
INSERT INTO unisql_students (id,name, age, grade) VALUES(2,'Bob', 22, 78);
INSERT INTO unisql_students (id,name, age, grade) VALUES(3,'Charlie', 21, 92);
INSERT INTO unisql_students (id,name, age, grade) VALUES(4,'David', 23, 75);
INSERT INTO unisql_students (id,name, age, grade) VALUES(5,'Emma', 22, 88);
INSERT INTO unisql_students (id,name, age, grade) VALUES(6,'Frank', 24, 79);
INSERT INTO unisql_students (id,name, age, grade) VALUES(7,'Grace', 20, 90);
INSERT INTO unisql_students (id,name, age, grade) VALUES(8,'Harry', 22, 84);
INSERT INTO unisql_students (id,name, age, grade) VALUES(9,'Isabella', 21, 90);
INSERT INTO unisql_students (id,name, age, grade) VALUES(10,'Jack', 23, 87);
INSERT INTO unisql_students (id,name, age, grade) VALUES(11,'Katherine', 24, 78);
INSERT INTO unisql_students (id,name, age, grade) VALUES(12,'Liam', 20, 95);
INSERT INTO unisql_students (id,name, age, grade) VALUES(13,'Mia', 22, 82);

-- 计算年龄和成绩之间的相关系数
-- 转换前Oracle SQL:
SELECT CORR(age, grade) AS age_grade_corr FROM unisql_students;
AGE_GRADE_CORR                             |
-------------------------------------------+
-0.7343934402070001857892159538585929477569|

-- 转换后LightDB-Oracle SQL:
SELECT CORR(age, grade) AS age_grade_corr FROM unisql_students
age_grade_corr     |
-------------------+
-0.7343934402070003|

4.2.10.3. COUNT

语法
COUNT({ * | [ DISTINCT | ALL ] expr }) [ OVER (analytic_clause) ]
描述
该函数用于返回查询 expr 的行数。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

星号(*)

表示返回满足条件的所有行,且包含重复行和空行。

DISTINCT ALL

查询时是否去重。为可选项,默认值 ALL。ALL:返回所有值,包含重复行,且忽略空行。DISTINCT:返回的行中去除重复行,且忽略空行。

expr

指定参与计算的列名。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 转换前Oracle SQL:
SELECT count(1),count(*),count(employee_id),count(DISTINCT(department_id)) FROM unisql_employee ke;
COUNT(1)|COUNT(*)|COUNT(EMPLOYEE_ID)|COUNT(DISTINCT(DEPARTMENT_ID))|
--------+--------+------------------+------------------------------+
      6|       6|                 6|                             3|


-- 转换后LightDB-Oracle SQL:
SELECT count(1),count(1),count(employee_id),count(DISTINCT (department_id)) FROM unisql_employee AS ke
count|count|count|count|
-----+-----+-----+-----+
    6|    6|    6|    3|

4.2.10.4. COVAR_POP

语法
COVAR_SAMP(expr1, expr2) [ OVER (analytic_clause) ]
描述
该函数用于计算一组数值对的样本协方差。可以将该函数用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

expr1

指定第一个数值表达式,属于数值数据类型或可以隐式转换为数值数据类型的值。

expr2

指定第二个数值表达式,属于数值数据类型或可以隐式转换为数值数据类型的值。

OVER

使用 OVER 子句定义窗口进行计算。

示例

-- 计算总体协方差
-- 转换前Oracle SQL:
SELECT COVAR_POP(age, grade) AS pop_covariance FROM unisql_students;
POP_COVARIANCE                           |
-----------------------------------------+
-5.86982248520710059171597633136094674615|

-- 转换后LightDB-Oracle SQL:
SELECT COVAR_POP(age, grade) AS pop_covariance FROM unisql_students
pop_covariance    |
------------------+
-5.869822485207101|

4.2.10.5. COVAR_SAMP

语法
COVAR_SAMP(expr1, expr2) [ OVER (analytic_clause) ]
描述
该函数用于计算一组数值对的样本协方差。可以将该函数用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

expr1

指定第一个数值表达式,属于数值数据类型或可以隐式转换为数值数据类型的值。

expr2

指定第二个数值表达式,属于数值数据类型或可以隐式转换为数值数据类型的值。

OVER

使用 OVER 子句定义窗口进行计算。

示例

-- 计算样本协方差
-- 转换前Oracle SQL:
SELECT COVAR_SAMP(age, grade) AS samp_covariance FROM unisql_students;
SAMP_COVARIANCE                        |
---------------------------------------+
-6.358974358974358974358974358974358975|

-- 转换后LightDB-Oracle SQL:
SELECT COVAR_SAMP(age, grade) AS samp_covariance FROM unisql_students
samp_covariance  |
-----------------+
-6.35897435897436|

4.2.10.6. CUME_DIST

语法

/*聚合语法*/
CUME_DIST( expr[,expr]...)
WITHIN GROUP (ORDER BY expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ] [,expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ]]...)

/*分析语法*/
CUME_DIST() OVER ([ query_partition_clause ] order_by_clause)
描述
该函数用于计算一组值中的某个值的累积分布,返回值的范围为 (0,1]。可以将此函数用作聚合或分析函数。

说明

  • 作为分析函数,该函数计算指定值在一组值中的相对位置。对于行 row,假设按升序排列,row 的 cume_dist 是值低于或等于 row 值的行数除以被计算的行数(整个查询结果集或分区)。

  • 作为聚合函数,该函数的参数标识每个聚合组中的单个假设行。因此,它们必须全部计算为每个聚合组内的常量表达式。常量参数表达式和 ORDER BY 聚合子句中的表达式按位置匹配。因此,参数的数量必须相同,并且它们的类型必须兼容。如果指定值与分组序列中某值重复,则将两个重复的值视为一个值处理。

参数解释

参数

说明

expr

指定要查询的值。

expr_col

指定要查询的值对应的列名。

DESC

ASC

指定列表的排序方式,为可选项。 * ASC 为升序排序,为默认值。 * DESC 为降序排序。

NULLS { FIRST

LAST }

排序后 expr_col 中 NULL 值的位置,为可选项。 * NULLS FIRST 表示 NULL 值排在非空值的前面。 * NULLS LAST 表示 NULL 值排在非空值的后面,为默认值。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 20岁 在列 age 中的位置
-- 转换前Oracle SQL:
SELECT CUME_DIST(20) WITHIN GROUP (ORDER BY age) FROM unisql_students;
CUME_DIST(20)WITHINGROUP(ORDERBYAGE)      |
------------------------------------------+
0.2857142857142857142857142857142857142857|

-- 转换后LightDB-Oracle SQL:
SELECT CUME_DIST(20) WITHIN GROUP (ORDER BY age) FROM unisql_students
cume_dist         |
------------------+
0.2857142857142857|

4.2.10.7. DENSE_RANK

语法

/*聚合语法*/
DENSE_RANK(expr [, expr ...]) WITHIN GROUP ( ORDER BY expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ] [,expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ]]... )

/*分析语法*/
DENSE_RANK( ) OVER([ query_partition_clause ] order_by_clause)
描述
该函数功能是计算有序行组中行的秩。秩的值是从 1 开始的连续整数,最大的秩值是符合查询结果的数值。具有相同值的排序标准的行接收相同的秩,相同的行数不会被记录到下个排名中。可以将其用作聚合或分析函数。

说明

  • 作为聚合函数,DENSE_RANK 根据指定的排序规范计算由函数的参数标识的假设行的密集等级。常量参数表达式 expr 和 order_by_clause 聚合中的表达式按位置匹配。因此,参数的数量必须相同并且类型必须兼容。

  • 作为一个分析函数,DENSE_RANK 根据 order_by_clause 中 value_exprs 的值,计算从查询返回的每一行相对于其他行的秩。

参数解释

参数

说明

expr

对应列中数据类型的值。

expr_col

指定要查询的值对应的列名。

DESC | ASC

指定列表的排序方式,为可选项。ASC 为升序排序,默认值。DESC 为降序排序。

NULLS { FIRST | LAST }

排序后 expr_col 中 NULL 值的位置,为可选项。NULLS FIRST 表示 NULL 值排在非空值的前面。NULLS LAST 表示 NULL 值排在非空值的后面,为默认值。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 转换前Oracle SQL:
SELECT DENSE_RANK(15500, .05) WITHIN GROUP (ORDER BY salary DESC, commission_pct) "Dense Rank" FROM unisql_employee;
Dense Rank|
----------+
         4|

-- 转换后LightDB-Oracle SQL:
SELECT DENSE_RANK(15500, 0.05) WITHIN GROUP (ORDER BY salary DESC,commission_pct) AS "Dense Rank" FROM unisql_employee
Dense Rank|
----------+
         4|

-- 转换前Oracle SQL:
SELECT DENSE_RANK(30000,0.06) WITHIN GROUP (ORDER BY salary desc,commission_pct) AS denseRank FROM unisql_employee ke;
DENSERANK|
---------+
      2|

-- 转换后LightDB-Oracle SQL:
SELECT DENSE_RANK(30000, 0.06) WITHIN GROUP (ORDER BY salary DESC,commission_pct) AS denseRank FROM unisql_employee AS ke
denserank|
---------+
      2|

4.2.10.8. LISTAGG

语法
LISTAGG (measure_expr [,'delimiter']) [ WITHIN GROUP ] (order_by_clause)
描述
该函数用于列转行,LISTAGG 对 ORDER BY 子句中指定的每个组内的数据进行排序,然后合并度量列的值

参数解释

参数

说明

measure_expr

可以是任何表达式。度量列中的空值将被忽略。

delimiter

指定用于分隔度量值的字符串。此子句是可选的,默认为 NULL。

示例

-- 转换前Oracle SQL:
SELECT LISTAGG(name, '; ') WITHIN GROUP (ORDER BY employee_id,name) AS rk FROM unisql_employee WHERE department_id=1;
RK              |
----------------+
JACK; TOM; LINDA|

-- 转换后LightDB-Oracle SQL:
SELECT LISTAGG(name, '; ') WITHIN GROUP (ORDER BY employee_id,name) AS rk FROM unisql_employee WHERE department_id=1
   rk              |
----------------+
JACK; TOM; LINDA|


-- 使用语法词ON OVERFLOW TRUNCATE/ON OVERFLOW ERROR
CREATE TABLE listagg_test_employees (
emp_id int,
emp_name VARCHAR(100),
department_id int
);

-- 插入数据
INSERT INTO listagg_test_employees (emp_id, emp_name, department_id) VALUES (1, 'John Doe', 1);
INSERT INTO listagg_test_employees (emp_id, emp_name, department_id) VALUES (2, 'Jane Smith', 1);
INSERT INTO listagg_test_employees (emp_id, emp_name, department_id) VALUES (3, 'Mark Johnson', 2);
INSERT INTO listagg_test_employees (emp_id, emp_name, department_id) VALUES (4, 'Emily Davis', 2);

SELECT LISTAGG(emp_name ON OVERFLOW TRUNCATE) rk FROM listagg_test_employees;
SELECT LISTAGG(emp_name, ', ' ON OVERFLOW TRUNCATE) rk FROM listagg_test_employees;
SELECT LISTAGG(emp_name, ', ' ON OVERFLOW TRUNCATE) WITHIN GROUP (ORDER BY department_id) rk FROM listagg_test_employees;
SELECT LISTAGG(emp_name,', ' ON OVERFLOW TRUNCATE) over(partition by department_id) rk FROM listagg_test_employees;

SELECT LISTAGG(emp_name ON OVERFLOW ERROR) rk FROM listagg_test_employees;
SELECT LISTAGG(emp_name, ', ' ON OVERFLOW ERROR) rk FROM listagg_test_employees;
SELECT LISTAGG(emp_name, ', ' ON OVERFLOW ERROR) WITHIN GROUP (ORDER BY department_id) rk FROM listagg_test_employees;
SELECT LISTAGG(emp_name,', ' ON OVERFLOW ERROR) over(partition by department_id) rk FROM listagg_test_employees;

4.2.10.9. MAX

语法
MAX ([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]
描述
该函数返回参数中指定的列中的最大值。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

DISTINCT 或 ALL

查询时是否去重。为可选项,默认值 ALL。ALL:返回所有值,包含重复行,且忽略值为 NULL 的行。DISTINCT:返回的行中去除重复行,且忽略值为 NULL 的行。

expr

可为数值、字符、日期型或其它类型的数据列或表达式。

OVER

使用 OVER 子句定义窗口进行计算。

示例

-- 转换前Oracle SQL:
SELECT MAX(salary),MAX(1),MAX(DISTINCT department_id) FROM unisql_employee ke;
MAX(SALARY)|MAX(1)|MAX(DISTINCTDEPARTMENT_ID)|
-----------+------+--------------------------+
      50000|     1|                         3|

-- 转换后LightDB-Oracle SQL:
SELECT MAX(salary),MAX(1),MAX(DISTINCT department_id) FROM unisql_employee AS ke
max  |max|max|
-----+---+---+
50000|  1|  3|

4.2.10.10. MEDIAN

语法
MEDIAN(expr) [ OVER (query_partition_clause) ]
描述
该函数用于返回一组数值的中值,即将一组数值排序后返回居于中间的数值。如果参数集合中包含偶数个数值,该函数将返回位于中间的两个数的平均值。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

expr

指定要求中值的数组名称,参数类型属于数值数据类型或可以隐式转换为数字数据类型。

OVER

使用 OVER 子句定义窗口进行计算。详细信息请参见 分析函数说明。

示例

-- 转换前Oracle SQL:
SELECT department_id, MEDIAN(salary) FROM unisql_employee ke GROUP BY department_id;
DEPARTMENT_ID|MEDIAN(SALARY)|
-------------+--------------+
            1|         10000|
            2|         25000|
            3|         50000|

-- 转换后LightDB-Oracle SQL:
SELECT department_id,MEDIAN(salary) FROM unisql_employee AS ke GROUP BY department_id
department_id|median |
-------------+-------+
            3|50000.0|
            2|25000.0|
            1|10000.0|

4.2.10.11. MIN

语法
MIN([ DISTINCT | UNIQUE | ALL ] expr) [ OVER (analytic_clause) ]
描述
该函数返回参数中指定列的最小值。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

DISTINCT | UNIQUE | ALL

查询时是否去重,为可选项。默认值 ALL。ALL:返回所有值,包含重复行,且忽略值为 NULL 的行。DISTINCT:返回的行中去除重复行,且忽略值为 NULL 的行。

expr

可为数值、字符、日期型或其它数据类型的列或表达式。

OVER

使用 OVER 子句定义窗口进行计算。详细信息请参见 分析函数说明。

示例

-- 转换前Oracle SQL:
SELECT MIN(SALARY),MIN(1),MIN(DISTINCT department_id) FROM unisql_employee;
MIN(SALARY)|MIN(1)|MIN(DISTINCTDEPARTMENT_ID)|
-----------+------+--------------------------+
      5000|     1|                         1|


-- 转换后LightDB-Oracle SQL:
SELECT MIN(SALARY),MIN(1),MIN(DISTINCT department_id) FROM unisql_employee
min |min|min|
----+---+---+
5000|  1|  1|

4.2.10.12. PERCENT_RANK

语法

/* 聚合语法 */
PERCENT_RANK(expr [, expr ...]) WITHIN GROUP ( ORDER BY expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ]  [,expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ]] ...)

/* 分析语法 */
PERCENT_RANK( ) OVER ([query_partition_clause] order_by_clause)

警告

统一SQL暂未支持聚合语法的解析

4.2.10.13. PERCENTILE_CONT

语法

PERCENTILE_CONT(percentile) WITHIN GROUP (ORDER BY expr [ DESC | ASC ])
[ OVER (query_partition_clause) ]
描述
该函数是一个假定连续分布模型的逆分布函数。根据指定百分比值和排序规范,返回一个在该排序规范的给定百分比值的内插值。在计算中忽略空值。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

percentile

指定百分位的值,是一个数值数据类型的常量,取值范围为 [0 1]。说明 MEDIAN 函数相当于是 percentile 为 0.5 的特殊情况。

expr

指定排序规范的表达式,数据类型属于数值类型或日期时间类型。注意 expr 必须为涉及列引用的单个表达式,不允许使用多个表达式。

DESC

ASC

指定列表的排序方式,为可选项。ASC 为升序排序,为默认值。DESC 为降序排序。

OVER

使用 OVER 子句定义窗口进行计算

示例

CREATE TABLE unisql_test_data (
 id int PRIMARY KEY,
 value INTEGER
);

INSERT INTO unisql_test_data(id,value) VALUES (1,10);
INSERT INTO unisql_test_data(id,value) VALUES (2,20);
INSERT INTO unisql_test_data(id,value) VALUES (3,30);
INSERT INTO unisql_test_data(id,value) VALUES (4,40);
INSERT INTO unisql_test_data(id,value) VALUES (5,50);
INSERT INTO unisql_test_data(id,value) VALUES (6,60);
INSERT INTO unisql_test_data(id,value) VALUES (7,70);
INSERT INTO unisql_test_data(id,value) VALUES (8,80);
INSERT INTO unisql_test_data(id,value) VALUES (9,90);
INSERT INTO unisql_test_data(id,value) VALUES (10,100);

-- 计算 value 列的给定百分位数的连续值
-- 转换前Oracle SQL:
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY value) FROM unisql_test_data;
PERCENTILE_CONT(0.5)WITHINGROUP(ORDERBYVALUE)|
---------------------------------------------+
                                           55|

-- 转换后LightDB-Oracle SQL:
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY value) FROM unisql_test_data
percentile_cont|
---------------+
           55.0|

4.2.10.14. PERCENTILE_DISC

语法

PERCENTILE_DISC(expr1) WITHIN GROUP (ORDER BY expr2 [ DESC | ASC ])
[ OVER (query_partition_clause) ]
描述
该函数根据一个百分位值和指定排序规范,返回大于或等于百分位值的最小累积分布值(相对于同一排序规范)的值。在计算中忽略空值。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

expr1

指定百分位的值,是一个数值数据类型的常量,取值范围为 [0

1]。

expr2

指定用于排序和计算百分比的表达式,数据类型属于数值类型或日期时间类型。

DESC | ASC

指定列表的排序方式,为可选项。ASC 为升序排序,为默认值。DESC 为降序排序。

OVER

使用 OVER 子句定义窗口进行计算。

示例

-- 计算指定百分位数的值
-- 转换前Oracle SQL:
SELECT PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY value) AS median_value FROM unisql_test_data;
MEDIAN_VALUE|
------------+
         50|

-- 转换后LightDB-Oracle SQL:
SELECT PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY value) AS median_value FROM unisql_test_data
median_value|
------------+
         50|

4.2.10.15. RANK

语法

/*聚合语法*/
RANK(expr [, expr ]...) WITHIN GROUP( ORDER BY expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ] [, expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ]]...)

/*分析语法*/
RANK() OVER ([ query_partition_clause ] order_by_clause)
描述
该函数用于计算一个值在一组值的排名。当有相同排序值时,将会有相同的排名,并且值相同的行数会被记录到下个排名中。可以将此函数用作聚合或分析函数

说明

  • 作为聚合函数,RANK 计算由参数 expr 标识的假设行相对于指定排序规范的排名。参数表达式 expr 和 ORDER BY 聚合子句中的表达式按位置匹配。因此,参数的数量必须相同,并且它们的数据类型必须兼容。

  • 作为分析函数,RANK 计算从查询相对于由查询返回的其他行返回的每一行的秩,基于所述值 value_exprs 中 order_by_clause。

参数解释

参数

说明

expr

指定要查询的值。

expr_col

指定要查询的值对应的列名。

DESC | ASC

指定列表的排序方式,为可选项。ASC 为升序排序,默认值。DESC 为降序排序。

NULLS { FIRST | LAST }

排序后 expr_col 中 NULL 值的位置,为可选项。NULLS FIRST 表示 NULL 值排在非空值的前面。NULLS LAST 表示 NULL 值排在非空值的后面,为默认值。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 转换前Oracle SQL:
SELECT RANK(40) WITHIN GROUP (ORDER BY id DESC) "Rank of 40" FROM unisql_test_data;
Rank of 40|
----------+
         1|

-- 转换后LightDB-Oracle SQL:
SELECT RANK(40) WITHIN GROUP (ORDER BY id DESC) AS "Rank of 40" FROM unisql_test_data
Rank of 40|
----------+
         1|

4.2.10.16. STDDEV

语法

STDDEV([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]
描述
该函数用于计算一组数值型数据标准差

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

DISTINCT | ALL

查询时是否去重。为可选项,默认值 ALL。ALL:全部数值列。DISTINCT:去重关键字,表示计算唯一值的总体标准差。

expr

数值类型或者可以转换成数值类型的值。

OVER

使用 OVER 子句定义窗口进行计算

示例

CREATE TABLE unisql_test_data (
 id int PRIMARY KEY,
 value INTEGER
);

INSERT INTO unisql_test_data(id,value) VALUES (1,10);
INSERT INTO unisql_test_data(id,value) VALUES (2,20);
INSERT INTO unisql_test_data(id,value) VALUES (3,30);
INSERT INTO unisql_test_data(id,value) VALUES (4,40);
INSERT INTO unisql_test_data(id,value) VALUES (5,50);
INSERT INTO unisql_test_data(id,value) VALUES (6,60);
INSERT INTO unisql_test_data(id,value) VALUES (7,70);
INSERT INTO unisql_test_data(id,value) VALUES (8,80);
INSERT INTO unisql_test_data(id,value) VALUES (9,90);
INSERT INTO unisql_test_data(id,value) VALUES (10,100);

-- 样本标准偏差
-- 转换前Oracle SQL:
SELECT STDDEV(value) AS sample_stddev FROM unisql_test_data;
SAMPLE_STDDEV                            |
-----------------------------------------+
30.27650354097491665422532809718193699195|

-- 转换后LightDB-Oracle SQL:
SELECT STDDEV(value) AS sample_stddev FROM unisql_test_data
sample_stddev      |
-------------------+
30.2765035409749167|

4.2.10.17. STDDEV_POP

语法

STDDEV_POP( [ALL] expr) [ OVER (analytic_clause) ]
描述
该函数将数值型数据作为参数计算总体标准差。总体标准差是总体方差的算术平方根。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

ALL

指定全部数值列,为可选项。默认值为 ALL。

expr

数值类型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)或者可以转换成数值类型的表达式。

OVER

使用 OVER 子句定义窗口进行计算。

示例

-- 总体标准偏差
-- 转换前Oracle SQL:
SELECT STDDEV_POP(value) AS pop_stddev FROM unisql_test_data;
POP_STDDEV                              |
----------------------------------------+
28.7228132326901432992530573410946465911|

-- 转换后LightDB-Oracle SQL:
SELECT stddev_pop(value) AS pop_stddev FROM unisql_test_data
pop_stddev         |
-------------------+
28.7228132326901433|

4.2.10.18. STDDEV_SAMP

语法

STDDEV_SAMP([ALL] expr) [ OVER (analytic_clause) ]
描述
该函数将数值型数据作为参数计算样本标准差,样本标准差是样本方差的算术平方根。STDDEV_SAMP 与函数 STDDEV 的不同之处在于,STDDEV 只有一行输入数据时返回 0,而 STDDEV_SAMP 返回 NULL。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

ALL

全部数值列。为可选项,默认值 ALL。

expr

数值类型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)或者可以转换成数值类型的表达式。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 样本标准偏差
-- 转换前Oracle SQL:
SELECT STDDEV_SAMP(value) AS samp_stddev FROM unisql_test_data;
SAMP_STDDEV                              |
-----------------------------------------+
30.27650354097491665422532809718193699195|

-- 转换后LightDB-Oracle SQL:
SELECT STDDEV_SAMP(value) AS samp_stddev FROM unisql_test_data
samp_stddev        |
-------------------+
30.2765035409749167|

4.2.10.19. SUM

语法
SUM([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]
描述
该函数返回指定参数的总和,可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

expr

指定参与计算的数值表达式。属于数值数据类型或可以隐式转换为数值数据类型的值。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 转换前Oracle SQL:
SELECT sum(salary),sum(1),sum(DISTINCT department_id) FROM unisql_employee ke;
SUM(SALARY)|SUM(1)|SUM(DISTINCTDEPARTMENT_ID)|
-----------+------+--------------------------+
     130000|     6|                         6|

-- 转换后LightDB-Oracle SQL:
SELECT sum(salary),sum(1),sum(DISTINCT department_id) FROM unisql_employee AS ke
sum   |sum|sum|
------+---+---+
130000|  6|  6|

4.2.10.20. VAR_POP

语法
VAR_POP(expr) [ OVER (analytic_clause) ]
描述
该函数返回一组数值集合的总体方差(忽略 NULL)。可以将该函数用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

expr

指定参与计算的数值表达式。属于数值数据类型或可以隐式转换为数值数据类型的值。

OVER

使用 OVER 子句定义窗口进行计算。

示例

-- 总体方差
-- 转换前Oracle SQL:
SELECT VAR_POP(value) AS pop_variance FROM unisql_test_data;
POP_VARIANCE|
------------+
         825|

-- 转换后LightDB-Oracle SQL:
SELECT var_pop(value) AS pop_variance FROM unisql_test_data
pop_variance|
------------+
         825|

4.2.10.21. VAR_SAMP

语法
VAR_SAMP(expr) [ OVER (analytic_clause) ]
描述
该函数返回一组数值集合的样本方差(忽略 NULL)。可以将该函数用作聚合或分析函数

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

expr

指定参与计算的数值表达式。属于数值数据类型或可以隐式转换为数值数据类型的值。

OVER

使用 OVER 子句定义窗口进行计算。

示例

-- 样本方差
-- 转换前Oracle SQL:
SELECT VAR_SAMP(value) AS samp_variance FROM unisql_test_data;
SAMP_VARIANCE                           |
----------------------------------------+
916.666666666666666666666666666666666667|

-- 转换后LightDB-Oracle SQL:
SELECT VAR_SAMP(value) AS samp_variance FROM unisql_test_data
samp_variance       |
--------------------+
916.6666666666666667|

4.2.10.22. VARIANCE

语法
VARIANCE([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]
描述
该函数功能是返回指定列的方差。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

DISTINCT | ALL

查询时是否去重。为可选项,默认值 ALL。ALL:查询时不去除数据中的重复值,且忽略数据中的 NULL 值。DISTINCT:查询时去除数据中的重复值,且忽略数据中的 NULL 值。

expr

数值数据类型或任何可以隐式转换为数值数据类型的表达式。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 计算年龄的样本方差
-- 转换前Oracle SQL:
SELECT VARIANCE(age) AS age_variance FROM unisql_students;
AGE_VARIANCE                          |
--------------------------------------+
1.974358974358974358974358974358974359|


-- 转换后LightDB-Oracle SQL:
SELECT VARIANCE(age) AS age_variance FROM unisql_students
age_variance      |
------------------+
1.9743589743589744|

4.2.11. 分析函数

4.2.11.1. AVG

语法
AVG([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]
描述
该函数将数值类型或者可以转换成数值类型的表达式作为参数求平均值。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

DISTINCT 或 ALL

查询时是否去重。为可选项,默认值 ALL。ALL:查询时不去除数据中的重复值,且忽略数据中的 NULL 值。DISTINCT:查询时去除数据中的重复值,且忽略数据中的 NULL 值。

expr

指定要计算的列名。列的数据类型是数值类型或者可以转换成数值类型的表达式。数值类型可以为 NUMBER、FLOAT、BINARY_FLOAT 或 BINARY_DOUBLE。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 转换前Oracle SQL:
SELECT employee_id,salary,department_id,AVG(salary) OVER (PARTITION BY department_id ORDER BY employee_id) AS avgRes FROM unisql_employee ke GROUP BY department_id,salary ,employee_id;
EMPLOYEE_ID|SALARY|DEPARTMENT_ID|AVGRES|
-----------+------+-------------+------+
         1|  5000|            1|  5000|
         2| 10000|            1|  7500|
         3| 15000|            1| 10000|
         4| 20000|            2| 20000|
         5| 30000|            2| 25000|
         6| 50000|            3| 50000|

-- 转换后LightDB-Oracle SQL:
SELECT employee_id,salary,department_id,AVG(salary) OVER (PARTITION BY department_id ORDER BY employee_id) AS avgRes FROM unisql_employee AS ke GROUP BY department_id,salary,employee_id
employee_id|salary|department_id|avgres|
-----------+------+-------------+------+
         1|  5000|            1|  5000|
         2| 10000|            1|  7500|
         3| 15000|            1| 10000|
         4| 20000|            2| 20000|
         5| 30000|            2| 25000|
         6| 50000|            3| 50000|

4.2.11.2. CORR

语法
CORR(expr1, expr2) [ OVER (analytic_clause) ]

警告

统一SQL暂未支持分析函数用法的解析

4.2.11.3. COUNT

语法
COUNT({ * | [ DISTINCT | ALL ] expr }) [ OVER (analytic_clause) ]
描述
该函数用于返回查询 expr 的行数。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

星号(*)

表示返回满足条件的所有行,且包含重复行和空行。

DISTINCT ALL

查询时是否去重。为可选项,默认值 ALL。ALL:返回所有值,包含重复行,且忽略空行。DISTINCT:返回的行中去除重复行,且忽略空行。

expr

指定参与计算的列名。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 转换前Oracle SQL:
SELECT id,value,count(id) OVER (PARTITION BY value) FROM unisql_test_data;
ID|VALUE|COUNT(ID)OVER(PARTITIONBYVALUE)|
--+-----+-------------------------------+
1|   10|                              1|
2|   20|                              1|
3|   30|                              1|
4|   40|                              1|
5|   50|                              1|
6|   60|                              1|
7|   70|                              1|
8|   80|                              1|
9|   90|                              1|
10|  100|                              1|

-- 转换后LightDB-Oracle SQL:
SELECT id,value,count(id) OVER (PARTITION BY value) FROM unisql_test_data
id|value|count|
--+-----+-----+
1|   10|    1|
2|   20|    1|
3|   30|    1|
4|   40|    1|
5|   50|    1|
6|   60|    1|
7|   70|    1|
8|   80|    1|
9|   90|    1|
10|  100|    1|

4.2.11.4. COVAR_POP

语法
COVAR_POP(expr1, expr2) [ OVER (analytic_clause) ]

警告

统一SQL暂未支持分析函数用法的解析

4.2.11.5. COVAR_SAMP

语法
COVAR_SAMP(expr1, expr2) [ OVER (analytic_clause) ]

警告

统一SQL暂未支持解析

4.2.11.6. CUME_DIST

语法

/*聚合语法*/
CUME_DIST( expr[,expr]...)
WITHIN GROUP (ORDER BY expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ] [,expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ]]...)

/*分析语法*/
CUME_DIST() OVER ([ query_partition_clause ] order_by_clause)
描述
该函数用于计算一组值中的某个值的累积分布,返回值的范围为 (0,1]。可以将此函数用作聚合或分析函数。

说明

  • 作为分析函数,该函数计算指定值在一组值中的相对位置。对于行 row,假设按升序排列,row 的 cume_dist 是值低于或等于 row 值的行数除以被计算的行数(整个查询结果集或分区)。

  • 作为聚合函数,该函数的参数标识每个聚合组中的单个假设行。因此,它们必须全部计算为每个聚合组内的常量表达式。常量参数表达式和 ORDER BY 聚合子句中的表达式按位置匹配。因此,参数的数量必须相同,并且它们的类型必须兼容。如果指定值与分组序列中某值重复,则将两个重复的值视为一个值处理。

参数解释

参数

说明

expr

指定要查询的值。

expr_col

指定要查询的值对应的列名。

DESC | ASC

指定列表的排序方式,为可选项。 * ASC 为升序排序,为默认值。 * DESC 为降序排序。

NULLS { FIRST | LAST }

排序后 expr_col 中 NULL 值的位置,为可选项。 * NULLS FIRST 表示 NULL 值排在非空值的前面。 * NULLS LAST 表示 NULL 值排在非空值的后面,为默认值。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 计算当前行的累积分布
-- 转换前Oracle SQL:
SELECT CUME_DIST() OVER (ORDER BY grade) AS cum_dist FROM unisql_students;
CUM_DIST                                  |
------------------------------------------+
0.0769230769230769230769230769230769230769|
0.2307692307692307692307692307692307692308|
0.2307692307692307692307692307692307692308|
0.3076923076923076923076923076923076923077|
0.3846153846153846153846153846153846153846|
0.4615384615384615384615384615384615384615|
0.5384615384615384615384615384615384615385|
0.6153846153846153846153846153846153846154|
0.6923076923076923076923076923076923076923|
0.8461538461538461538461538461538461538462|
0.8461538461538461538461538461538461538462|
0.9230769230769230769230769230769230769231|
                                         1|

-- 转换后LightDB-Oracle SQL:
SELECT CUME_DIST() OVER (ORDER BY grade) AS cum_dist FROM unisql_students
cum_dist           |
-------------------+
0.07692307692307693|
0.23076923076923078|
0.23076923076923078|
 0.3076923076923077|
0.38461538461538464|
0.46153846153846156|
 0.5384615384615384|
 0.6153846153846154|
 0.6923076923076923|
 0.8461538461538461|
 0.8461538461538461|
 0.9230769230769231|
                1.0|

4.2.11.7. DENSE_RANK

语法

/*聚合语法*/
DENSE_RANK(expr [, expr ...]) WITHIN GROUP ( ORDER BY expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ] [,expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ]]... )

/*分析语法*/
DENSE_RANK( ) OVER([ query_partition_clause ] order_by_clause)
描述
该函数功能是计算有序行组中行的秩。秩的值是从 1 开始的连续整数,最大的秩值是符合查询结果的数值。具有相同值的排序标准的行接收相同的秩,相同的行数不会被记录到下个排名中。可以将其用作聚合或分析函数。

说明

  • 作为聚合函数,DENSE_RANK 根据指定的排序规范计算由函数的参数标识的假设行的密集等级。常量参数表达式 expr 和 order_by_clause 聚合中的表达式按位置匹配。因此,参数的数量必须相同并且类型必须兼容。

  • 作为一个分析函数,DENSE_RANK 根据 order_by_clause 中 value_exprs 的值,计算从查询返回的每一行相对于其他行的秩。

参数解释

参数

说明

expr

对应列中数据类型的值。

expr_col

指定要查询的值对应的列名。

DESC | ASC

指定列表的排序方式,为可选项。ASC 为升序排序,默认值。DESC 为降序排序。

NULLS { FIRST | LAST }

排序后 expr_col 中 NULL 值的位置,为可选项。NULLS FIRST 表示 NULL 值排在非空值的前面。NULLS LAST 表示 NULL 值排在非空值的后面,为默认值。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 计算值的密集排名
-- 转换前Oracle SQL:
SELECT name, DENSE_RANK() OVER (ORDER BY grade) AS dense_rank FROM unisql_students;
NAME     |DENSE_RANK|
---------+----------+
David    |         1|
Bob      |         2|
Katherine|         2|
Frank    |         3|
Mia      |         4|
Harry    |         5|
Alice    |         6|
Jack     |         7|
Emma     |         8|
Isabella |         9|
Grace    |         9|
Charlie  |        10|
Liam     |        11|

-- 转换后LightDB-Oracle SQL:
SELECT name,DENSE_RANK() OVER (ORDER BY grade) AS dense_rank FROM unisql_students
name     |dense_rank|
---------+----------+
David    |         1|
Bob      |         2|
Katherine|         2|
Frank    |         3|
Mia      |         4|
Harry    |         5|
Alice    |         6|
Jack     |         7|
Emma     |         8|
Grace    |         9|
Isabella |         9|
Charlie  |        10|
Liam     |        11|


-- 转换前Oracle SQL:
SELECT department_id,salary,DENSE_RANK() over(PARTITION BY department_id ORDER BY salary) dr FROM unisql_employee ke  ORDER BY dr;
DEPARTMENT_ID|SALARY|DR|
-------------+------+--+
            1|  5000| 1|
            3| 50000| 1|
            2| 20000| 1|
            1| 10000| 2|
            2| 30000| 2|
            1| 15000| 3|

-- 转换后LightDB-Oracle SQL:
SELECT department_id,salary,DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary) AS dr FROM unisql_employee AS ke ORDER BY dr
department_id|salary|dr|
-------------+------+--+
            1|  5000| 1|
            2| 20000| 1|
            3| 50000| 1|
            1| 10000| 2|
            2| 30000| 2|
            1| 15000| 3|

4.2.11.8. FIRST_VALUE

语法

FIRST_VALUE { (expr) [{RESPECT | IGNORE} NULLS ]  | (expr [{RESPECT | IGNORE} NULLS ]) } OVER (analytic_clause)
描述
该函数是一个分析函数,功能是返回有序值中的第一个值。如果集合中的第一个值为 NULL,则函数返回NULL,除非您指定 IGNORE NULLS,该设置对于数据致密化很有用。expr 列中 NULL 值行对应的返回值是 NULL

参数解释

参数

说明

expr

指定要返回值的列名。注意 不能将 FIRST_VALUE 或其他分析函数用于 expr 来嵌套分析函数。

{RESPECT | IGNORE} NULLS

表示是否忽略 NULL 值,为可选项。默认值为 RESPECT NULLS。RESPECT NULLS 表示不忽略 NULL 值。IGNORE NULLS 表示忽略 NULL 值。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 返回年龄最小的学生名字
-- 转换前Oracle SQL:
SELECT id,name,age,grade,FIRST_VALUE(name) OVER (ORDER BY age) AS youngest_student FROM unisql_students;
ID|NAME     |AGE|GRADE|YOUNGEST_STUDENT|
--+---------+---+-----+----------------+
1|Alice    | 20|   85|Alice           |
7|Grace    | 20|   90|Alice           |
12|Liam     | 20|   95|Alice           |
3|Charlie  | 21|   92|Alice           |
9|Isabella | 21|   90|Alice           |
2|Bob      | 22|   78|Alice           |
5|Emma     | 22|   88|Alice           |
8|Harry    | 22|   84|Alice           |
13|Mia      | 22|   82|Alice           |
4|David    | 23|   75|Alice           |
10|Jack     | 23|   87|Alice           |
6|Frank    | 24|   79|Alice           |
11|Katherine| 24|   78|Alice           |

-- 转换后LightDB-Oracle SQL:
SELECT id,name,age,grade,FIRST_VALUE(name) OVER (ORDER BY age) AS youngest_student FROM unisql_students
id|name     |age|grade|youngest_student|
--+---------+---+-----+----------------+
1|Alice    | 20|   85|Alice           |
7|Grace    | 20|   90|Alice           |
12|Liam     | 20|   95|Alice           |
3|Charlie  | 21|   92|Alice           |
9|Isabella | 21|   90|Alice           |
5|Emma     | 22|   88|Alice           |
2|Bob      | 22|   78|Alice           |
8|Harry    | 22|   84|Alice           |
13|Mia      | 22|   82|Alice           |
10|Jack     | 23|   87|Alice           |
4|David    | 23|   75|Alice           |
11|Katherine| 24|   78|Alice           |
6|Frank    | 24|   79|Alice           |


-- 转换前Oracle SQL:
SELECT employee_id, name, salary, FIRST_VALUE(name) OVER (ORDER BY salary ASC ROWS UNBOUNDED PRECEDING) AS fv FROM unisql_employee;
EMPLOYEE_ID|NAME |SALARY|FV  |
-----------+-----+------+----+
         1|JACK |  5000|JACK|
         2|TOM  | 10000|JACK|
         3|LINDA| 15000|JACK|
         4|ADA  | 20000|JACK|
         5|TINA | 30000|JACK|
         6|KATE | 50000|JACK|

-- 转换后LightDB-Oracle SQL:
SELECT employee_id, name, salary, FIRST_VALUE(name) OVER (ORDER BY salary ASC ROWS UNBOUNDED PRECEDING) AS fv FROM unisql_employee
employee_id|name |salary|fv  |
-----------+-----+------+----+
         1|JACK |  5000|JACK|
         2|TOM  | 10000|JACK|
         3|LINDA| 15000|JACK|
         4|ADA  | 20000|JACK|
         5|TINA | 30000|JACK|
         6|KATE | 50000|JACK|

4.2.11.9. LAG

语法

LAG { (value_expr [,offset [,default]]) [{ RESPECT|IGNORE } NULLS ] | (value_expr [{ RESPECT|IGNORE } NULLS ] [,offset [,default] ]) } OVER([query_partition_clause] order_by_clause)
描述
该函数是一个分析函数,功能是在查询中取出同一字段的前 offset 行的数据作为独立的列存在表中。这种操作可以代替表的自联接。

参数解释

参数

说明

value_expr

指定需要查询的字段。注意 不能使用 LAG 函数或其他分析函数来嵌套 value_expr。

offset

指定查询 value_expr 的偏移量,一个大于零的整数,为可选项。默认值为 1。

default

指定没有符合条件的默认值。如果偏移量超出窗口的范围,则返回 default 的值,为可选项。默认值为 NULL。

{RESPECT | IGNORE} NULLS

表示是否忽略 NULL 值,为可选项。默认值为 RESPECT NULLS。RESPECT NULLS 表示不忽略 NULL 值。IGNORE NULLS 表示忽略 NULL 值。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 返回每个学生的上一位学生的年龄
-- 转换前Oracle SQL:
SELECT name, age, LAG(age) OVER (ORDER BY age) AS previous_age FROM unisql_students;
NAME     |AGE|PREVIOUS_AGE|
---------+---+------------+
Alice    | 20|            |
Grace    | 20|          20|
Liam     | 20|          20|
Isabella | 21|          20|
Charlie  | 21|          21|
Bob      | 22|          21|
Mia      | 22|          22|
Emma     | 22|          22|
Harry    | 22|          22|
Jack     | 23|          22|
David    | 23|          23|
Katherine| 24|          23|
Frank    | 24|          24|

-- 转换后LightDB-Oracle SQL:
SELECT name,age,LAG(age) OVER (ORDER BY age) AS previous_age FROM unisql_students
name     |age|previous_age|
---------+---+------------+
Alice    | 20|            |
Grace    | 20|          20|
Liam     | 20|          20|
Charlie  | 21|          20|
Isabella | 21|          21|
Emma     | 22|          21|
Bob      | 22|          22|
Harry    | 22|          22|
Mia      | 22|          22|
Jack     | 23|          22|
David    | 23|          23|
Katherine| 24|          23|
Frank    | 24|          24|


-- 转换前Oracle SQL:
SELECT name, age, LAG(age,3) OVER (ORDER BY age) AS previous_age FROM unisql_students;
NAME     |AGE|PREVIOUS_AGE|
---------+---+------------+
Alice    | 20|            |
Grace    | 20|            |
Liam     | 20|            |
Isabella | 21|          20|
Charlie  | 21|          20|
Bob      | 22|          20|
Mia      | 22|          21|
Emma     | 22|          21|
Harry    | 22|          22|
Jack     | 23|          22|
David    | 23|          22|
Katherine| 24|          22|
Frank    | 24|          23|

-- 转换后LightDB-Oracle SQL:
SELECT name,age,LAG(age, 3) OVER (ORDER BY age) AS previous_age FROM unisql_students
name     |age|previous_age|
---------+---+------------+
Alice    | 20|            |
Grace    | 20|            |
Liam     | 20|            |
Charlie  | 21|          20|
Isabella | 21|          20|
Emma     | 22|          20|
Bob      | 22|          21|
Harry    | 22|          21|
Mia      | 22|          22|
Jack     | 23|          22|
David    | 23|          22|
Katherine| 24|          22|
Frank    | 24|          23|

4.2.11.10. LAST_VALUE

语法

LAST_VALUE { (expr) [{RESPECT | IGNORE} NULLS ] | (expr [{RESPECT | IGNORE} NULLS ]) } OVER (analytic_clause)
描述
该函数是一个分析函数,用于返回一组有序值中的最后一个值。如果集合中的最后一个值为 NULL,则该函数将返回 NULL,除非您指定 IGNORE NULLS

参数解释

参数

说明

expr

指定要返回值的列名。注意 不能将 LAST_VALUE 或其他分析函数用于 expr 来嵌套分析函数。

{RESPECT / IGNORE} NULLS

表示是否忽略 NULL 值 为可选项。默认值为 RESPECT NULLS。RESPECT NULLS 表示不忽略 NULL 值。IGNORE NULLS 表示忽略 NULL 值。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 返回每个学生的最后一位学生的年龄
-- 转换前Oracle SQL:
SELECT name, age, LAST_VALUE(age) OVER (ORDER BY age ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_age FROM unisql_students;
NAME     |AGE|LAST_AGE|
---------+---+--------+
Alice    | 20|      24|
Grace    | 20|      24|
Liam     | 20|      24|
Isabella | 21|      24|
Charlie  | 21|      24|
Bob      | 22|      24|
Mia      | 22|      24|
Emma     | 22|      24|
Harry    | 22|      24|
Jack     | 23|      24|
David    | 23|      24|
Katherine| 24|      24|
Frank    | 24|      24|

-- 转换后LightDB-Oracle SQL:
SELECT name,age,LAST_VALUE(age) OVER (ORDER BY age) AS last_age FROM unisql_students
name     |age|last_age|
---------+---+--------+
Alice    | 20|      20|
Grace    | 20|      20|
Liam     | 20|      20|
Charlie  | 21|      21|
Isabella | 21|      21|
Emma     | 22|      22|
Bob      | 22|      22|
Harry    | 22|      22|
Mia      | 22|      22|
Jack     | 23|      23|
David    | 23|      23|
Katherine| 24|      24|
Frank    | 24|      24|

4.2.11.11. LEAD

语法

LEAD { (value_expr [,offset [,default]]) [{ RESPECT|IGNORE } NULLS ] | (value_expr [{ RESPECT|IGNORE } NULLS ] [,offset [,default] ])  } OVER([query_partition_clause] order_by_clause)
描述
该函数是一个分析函数,功能是在查询中取出同一字段的后 offset 行的数据作为独立的列存在表中。这种操作可以代替表的自联接。

参数解释

参数

说明

value_expr

指定需要查询的字段。注意 不能使用 LEAD 函数或其他分析函数来嵌套 value_expr。

offset

指定查询 value_expr 的偏移量,一个大于零的整数。为可选项,默认值为 1。

default

指定没有符合条件的默认值。如果偏移量超出窗口的范围,则返回 default 的值。为可选项,默认值为 NULL。

{RESPECT | IGNORE} NULLS

表示是否忽略 NULL 值,为可选项。默认值为 RESPECT NULLS。RESPECT NULLS 表示不忽略 NULL 值。IGNORE NULLS 表示忽略 NULL 值。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 返回每个学生的下一位学生的年龄
-- 转换前Oracle SQL:
SELECT name, age, LEAD(age) OVER (ORDER BY age) AS next_age FROM unisql_students;
NAME     |AGE|NEXT_AGE|
---------+---+--------+
Alice    | 20|      20|
Grace    | 20|      20|
Liam     | 20|      21|
Isabella | 21|      21|
Charlie  | 21|      22|
Bob      | 22|      22|
Mia      | 22|      22|
Emma     | 22|      22|
Harry    | 22|      23|
Jack     | 23|      23|
David    | 23|      24|
Katherine| 24|      24|
Frank    | 24|        |

-- 转换后LightDB-Oracle SQL:
SELECT name,age,LEAD(age) OVER (ORDER BY age) AS next_age FROM unisql_students
name     |age|next_age|
---------+---+--------+
Alice    | 20|      20|
Grace    | 20|      20|
Liam     | 20|      21|
Charlie  | 21|      21|
Isabella | 21|      22|
Emma     | 22|      22|
Bob      | 22|      22|
Harry    | 22|      22|
Mia      | 22|      23|
Jack     | 23|      23|
David    | 23|      24|
Katherine| 24|      24|
Frank    | 24|        |


-- 转换前Oracle SQL:
SELECT name, age, LEAD(age,3) OVER (ORDER BY age) AS next_age FROM unisql_students;
NAME     |AGE|NEXT_AGE|
---------+---+--------+
Alice    | 20|      21|
Grace    | 20|      21|
Liam     | 20|      22|
Isabella | 21|      22|
Charlie  | 21|      22|
Bob      | 22|      22|
Mia      | 22|      23|
Emma     | 22|      23|
Harry    | 22|      24|
Jack     | 23|      24|
David    | 23|        |
Katherine| 24|        |
Frank    | 24|        |

-- 转换后LightDB-Oracle SQL:
SELECT name, age, LEAD(age,3) OVER (ORDER BY age) AS next_age FROM unisql_students;
name     |age|next_age|
---------+---+--------+
Alice    | 20|      21|
Grace    | 20|      21|
Liam     | 20|      22|
Charlie  | 21|      22|
Isabella | 21|      22|
Emma     | 22|      22|
Bob      | 22|      23|
Harry    | 22|      23|
Mia      | 22|      24|
Jack     | 23|      24|
David    | 23|        |
Katherine| 24|        |
Frank    | 24|        |

4.2.11.12. LISTAGG

语法
LISTAGG (measure_expr [,'delimiter']) [ WITHIN GROUP ] (order_by_clause)
描述
该函数用于列转行,LISTAGG 对 ORDER BY 子句中指定的每个组内的数据进行排序,然后合并度量列的值

参数解释

参数

说明

measure_expr

可以是任何表达式。度量列中的空值将被忽略。

delimiter

指定用于分隔度量值的字符串。此子句是可选的,默认为 NULL。

示例

-- 转换前Oracle SQL:
SELECT LISTAGG(name, '; ') over(partition by department_id) rk FROM unisql_employee ke;
RK              |
----------------+
JACK; TOM; LINDA|
JACK; TOM; LINDA|
JACK; TOM; LINDA|
ADA; TINA       |
ADA; TINA       |
KATE            |

-- 转换后LightDB-Oracle SQL:
SELECT LISTAGG(name, '; ') OVER (PARTITION BY department_id) AS rk FROM unisql_employee AS ke
rk              |
----------------+
JACK; TOM; LINDA|
JACK; TOM; LINDA|
JACK; TOM; LINDA|
ADA; TINA       |
ADA; TINA       |
KATE            |


-- 使用语法词ON OVERFLOW TRUNCATE/ON OVERFLOW ERROR
CREATE TABLE listagg_test_employees (
emp_id int,
emp_name VARCHAR(100),
department_id int
);

-- 插入数据
INSERT INTO listagg_test_employees (emp_id, emp_name, department_id) VALUES (1, 'John Doe', 1);
INSERT INTO listagg_test_employees (emp_id, emp_name, department_id) VALUES (2, 'Jane Smith', 1);
INSERT INTO listagg_test_employees (emp_id, emp_name, department_id) VALUES (3, 'Mark Johnson', 2);
INSERT INTO listagg_test_employees (emp_id, emp_name, department_id) VALUES (4, 'Emily Davis', 2);

SELECT LISTAGG(emp_name ON OVERFLOW TRUNCATE) rk FROM listagg_test_employees;
SELECT LISTAGG(emp_name, ', ' ON OVERFLOW TRUNCATE) rk FROM listagg_test_employees;
SELECT LISTAGG(emp_name, ', ' ON OVERFLOW TRUNCATE) WITHIN GROUP (ORDER BY department_id) rk FROM listagg_test_employees;
SELECT LISTAGG(emp_name,', ' ON OVERFLOW TRUNCATE) over(partition by department_id) rk FROM listagg_test_employees;

SELECT LISTAGG(emp_name ON OVERFLOW ERROR) rk FROM listagg_test_employees;
SELECT LISTAGG(emp_name, ', ' ON OVERFLOW ERROR) rk FROM listagg_test_employees;
SELECT LISTAGG(emp_name, ', ' ON OVERFLOW ERROR) WITHIN GROUP (ORDER BY department_id) rk FROM listagg_test_employees;
SELECT LISTAGG(emp_name,', ' ON OVERFLOW ERROR) over(partition by department_id) rk FROM listagg_test_employees;

4.2.11.13. MAX

语法
MAX ([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]
描述
该函数返回参数中指定的列中的最大值。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

DISTINCT 或 ALL

查询时是否去重。为可选项,默认值 ALL。ALL:返回所有值,包含重复行,且忽略值为 NULL 的行。DISTINCT:返回的行中去除重复行,且忽略值为 NULL 的行。

expr

可为数值、字符、日期型或其它类型的数据列或表达式。

OVER

使用 OVER 子句定义窗口进行计算。

示例

-- 转换前Oracle SQL:
SELECT department_id, name, salary,MAX(salary) OVER (PARTITION BY department_id) AS mgr_max FROM unisql_employee ORDER BY department_id, name, salary;
DEPARTMENT_ID|NAME |SALARY|MGR_MAX|
-------------+-----+------+-------+
            1|JACK |  5000|  15000|
            1|LINDA| 15000|  15000|
            1|TOM  | 10000|  15000|
            2|ADA  | 20000|  30000|
            2|TINA | 30000|  30000|
            3|KATE | 50000|  50000|

-- 转换后LightDB-Oracle SQL:
SELECT department_id,name,salary,MAX(salary) OVER (PARTITION BY department_id) AS mgr_max FROM unisql_employee ORDER BY department_id,name,salary
department_id|name |salary|mgr_max|
-------------+-----+------+-------+
            1|JACK |  5000|  15000|
            1|LINDA| 15000|  15000|
            1|TOM  | 10000|  15000|
            2|ADA  | 20000|  30000|
            2|TINA | 30000|  30000|
            3|KATE | 50000|  50000|

4.2.11.14. MEDIAN

语法
MEDIAN(expr) [ OVER (query_partition_clause) ]
描述
该函数用于返回一组数值的中值,即将一组数值排序后返回居于中间的数值。如果参数集合中包含偶数个数值,该函数将返回位于中间的两个数的平均值。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

expr

指定要求中值的数组名称,参数类型属于数值数据类型或可以隐式转换为数字数据类型。

OVER

使用 OVER 子句定义窗口进行计算。详细信息请参见 分析函数说明。

示例

-- 转换前Oracle SQL:
SELECT department_id, employee_id, salary,MEDIAN(salary) OVER(PARTITION BY department_id) FROM unisql_employee ORDER BY department_id, employee_id;
DEPARTMENT_ID|EMPLOYEE_ID|SALARY|MEDIAN(SALARY)OVER(PARTITIONBYDEPARTMENT_ID)|
-------------+-----------+------+--------------------------------------------+
            1|          1|  5000|                                       10000|
            1|          2| 10000|                                       10000|
            1|          3| 15000|                                       10000|
            2|          4| 20000|                                       25000|
            2|          5| 30000|                                       25000|
            3|          6| 50000|                                       50000|

-- 转换后LightDB-Oracle SQL:
SELECT department_id,employee_id,salary,MEDIAN(salary) OVER (PARTITION BY department_id) FROM unisql_employee ORDER BY department_id,employee_id
department_id|employee_id|salary|median |
-------------+-----------+------+-------+
            1|          1|  5000|10000.0|
            1|          2| 10000|10000.0|
            1|          3| 15000|10000.0|
            2|          4| 20000|25000.0|
            2|          5| 30000|25000.0|
            3|          6| 50000|50000.0|

4.2.11.15. MIN

语法
MIN([ DISTINCT | UNIQUE | ALL ] expr) [ OVER (analytic_clause) ]
描述
该函数返回参数中指定列的最小值。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

DISTINCT | UNIQUE | ALL

查询时是否去重,为可选项。默认值 ALL。ALL:返回所有值,包含重复行,且忽略值为 NULL 的行。DISTINCT:返回的行中去除重复行,且忽略值为 NULL 的行。

expr

可为数值、字符、日期型或其它数据类型的列或表达式。

OVER

使用 OVER 子句定义窗口进行计算。详细信息请参见 分析函数说明。

示例

-- 转换前Oracle SQL:
SELECT department_id, name, salary,
MIN(salary) OVER (PARTITION BY department_id) AS mgr_max
FROM unisql_employee
ORDER BY department_id, name, salary;
DEPARTMENT_ID|NAME |SALARY|MGR_MAX|
-------------+-----+------+-------+
            1|JACK |  5000|   5000|
            1|LINDA| 15000|   5000|
            1|TOM  | 10000|   5000|
            2|ADA  | 20000|  20000|
            2|TINA | 30000|  20000|
            3|KATE | 50000|  50000|

-- 转换后LightDB-Oracle SQL:
SELECT department_id,name,salary,MIN(salary) OVER (PARTITION BY department_id) AS mgr_max FROM unisql_employee ORDER BY department_id,name,salary
department_id|name |salary|mgr_max|
-------------+-----+------+-------+
            1|JACK |  5000|   5000|
            1|LINDA| 15000|   5000|
            1|TOM  | 10000|   5000|
            2|ADA  | 20000|  20000|
            2|TINA | 30000|  20000|
            3|KATE | 50000|  50000|

4.2.11.16. NTILE

语法
NTILE (expr) OVER ([ query_partition_clause ] order_by_clause)
描述
该函数是一个分析函数,功能是将有序数据集划分为若干个组,并为每一行分配适当的组号。组编号为 1 到 expr。

参数解释

参数

说明

expr

指定划分的组数。expr 值必须解析为大于等于 1 的正数,如果 expr 是一个非整数常量,则数据库将会该值截断为整数。如果 expr 大于行数,则将填充与行数相等的多个组,其余组为空。注意 不能通过使用 NTILE 或任何其他分析函数来嵌套分析函数。但是您可以在 expr 中使用其他内置函数表达式。

OVER

使用 OVER 子句定义窗口进行计算。

示例

-- 将学生按照年龄排序并分成两桶
-- 转换前Oracle SQL:
SELECT name, age, NTILE(2) OVER (ORDER BY age) AS age_bucket FROM unisql_students;
NAME     |AGE|AGE_BUCKET|
---------+---+----------+
Alice    | 20|         1|
Grace    | 20|         1|
Liam     | 20|         1|
Isabella | 21|         1|
Charlie  | 21|         1|
Bob      | 22|         1|
Mia      | 22|         1|
Emma     | 22|         2|
Harry    | 22|         2|
Jack     | 23|         2|
David    | 23|         2|
Katherine| 24|         2|
Frank    | 24|         2|

-- 转换后LightDB-Oracle SQL:
SELECT name,age,NTILE(2) OVER (ORDER BY age) AS age_bucket FROM unisql_students
name     |age|age_bucket|
---------+---+----------+
Alice    | 20|         1|
Grace    | 20|         1|
Liam     | 20|         1|
Charlie  | 21|         1|
Isabella | 21|         1|
Emma     | 22|         1|
Bob      | 22|         1|
Harry    | 22|         2|
Mia      | 22|         2|
Jack     | 23|         2|
David    | 23|         2|
Katherine| 24|         2|
Frank    | 24|         2|

4.2.11.17. NTH_VALUE

语法

NTH_VALUE (measure_expr, n) [ FROM { FIRST | LAST } ][ { RESPECT | IGNORE } NULLS ] OVER (analytic_clause)
描述
该函数功能是返回 analytic_clause 定义的窗口中第 n 行的 measure_expr 值

参数解释

参数

说明

measure_expr

指定返回数据的字段。

n

指定返回测量值的第 n 行。n 取值为正整数。 注意如果 n 是 NULL,函数将返回错误。如果 n 大于窗口内所有的行数,函数返回 NULL。

FROM { FIRST | LAST }

指定计算方向。为可选项,默认值为 FROM FIRST。FROM FIRST 表示从窗口的第一行开始计算。FROM LAST 表示最后一行开始计算。

{RESPECT | IGNORE} NULLS

表示是否忽略 NULL 值,为可选项。默认值为 RESPECT NULLS。RESPECT NULLS 表示不忽略 NULL 值。IGNORE NULLS 表示忽略 NULL 值。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 返回成绩第三名的学生名字
-- 转换前Oracle SQL:
SELECT name, grade, NTH_VALUE(name, 3) OVER (ORDER BY grade DESC) AS third_highest_grade_student FROM unisql_students;
NAME     |GRADE|THIRD_HIGHEST_GRADE_STUDENT|
---------+-----+---------------------------+
Liam     |   95|                           |
Charlie  |   92|                           |
Grace    |   90|Grace                      |
Isabella |   90|Grace                      |
Emma     |   88|Grace                      |
Jack     |   87|Grace                      |
Alice    |   85|Grace                      |
Harry    |   84|Grace                      |
Mia      |   82|Grace                      |
Frank    |   79|Grace                      |
Bob      |   78|Grace                      |
Katherine|   78|Grace                      |
David    |   75|Grace                      |

-- 转换后LightDB-Oracle SQL:
SELECT name,grade,NTH_VALUE(name, 3) OVER (ORDER BY grade DESC) AS third_highest_grade_student FROM unisql_students
name     |grade|third_highest_grade_student|
---------+-----+---------------------------+
Liam     |   95|                           |
Charlie  |   92|                           |
Grace    |   90|Grace                      |
Isabella |   90|Grace                      |
Emma     |   88|Grace                      |
Jack     |   87|Grace                      |
Alice    |   85|Grace                      |
Harry    |   84|Grace                      |
Mia      |   82|Grace                      |
Frank    |   79|Grace                      |
Katherine|   78|Grace                      |
Bob      |   78|Grace                      |
David    |   75|Grace                      |

4.2.11.18. PERCENT_RANK

语法

/* 聚合语法 */
PERCENT_RANK(expr [, expr ...]) WITHIN GROUP ( ORDER BY expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ]  [,expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ]] ...)

/* 分析语法 */
PERCENT_RANK( ) OVER ([query_partition_clause] order_by_clause)
描述
该函数用来计算一组值中的某个值的累积分布

说明

  • 作为聚合函数,PERCENT_RANK 计算某一个数在一个集合中的对应位置百分比,它的返回值范围为 (0, 1]。如果有 N 行数据,expr 的值,大于第二行的值而小于第三行的值,那么位置百分比等于 2/N。常量参数表达式和 ORDER BY 聚合子句中的表达式按位置匹配。因此,参数的数量必须相同,并且它们的类型必须兼容。如果指定值与分组序列中某值重复,则将两个相同的值视为一个值处理。

  • 作为分析函数,PERCENT_RANK 计算某列或某列组合后每行的百分比排序,它的返回值范围为 [0, 1]。当有相同排序值时,将会有相同的排名,并且值相同的行数会被记录到下个排名中。任何集合中的第一行的 PERCENT_RANK 函数为 0,位置百分比的计算公式为:位置百分比=序号/最大序号,具体示例请参见如下表格:

N

序号

位置百分比

A

0

0

B

1

0.25

C

2

0.5

D

3

0.75

E

4

1

参数解释

参数

说明

expr

指定要查询的值。

expr_col

指定要查询的值对应的列名。

DESC | ASC

指定列表的排序方式,为可选项。ASC 为升序排序,为默认值。DESC 为降序排序。

NULLS { FIRST | LAST }

排序后 expr_col 中 NULL 值的位置,为可选项。NULLS FIRST 表示 NULL 值排在非空值的前面。NULLS LAST 表示 NULL 值排在非空值的后面,为默认值。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 计算给定值的排名百分比
-- 转换前Oracle SQL:
SELECT id,value,PERCENT_RANK() OVER (ORDER BY value) AS percentile_rank FROM unisql_test_data;
ID|VALUE|PERCENTILE_RANK                           |
--+-----+------------------------------------------+
1|   10|                                         0|
2|   20|0.1111111111111111111111111111111111111111|
3|   30|0.2222222222222222222222222222222222222222|
4|   40|0.3333333333333333333333333333333333333333|
5|   50|0.4444444444444444444444444444444444444444|
6|   60|0.5555555555555555555555555555555555555556|
7|   70|0.6666666666666666666666666666666666666667|
8|   80|0.7777777777777777777777777777777777777778|
9|   90|0.8888888888888888888888888888888888888889|
10|  100|                                         1|

-- 转换后LightDB-Oracle SQL:
SELECT id,value,PERCENT_RANK() OVER (ORDER BY value) AS percentile_rank FROM unisql_test_data
id|value|percentile_rank   |
--+-----+------------------+
1|   10|               0.0|
2|   20|0.1111111111111111|
3|   30|0.2222222222222222|
4|   40|0.3333333333333333|
5|   50|0.4444444444444444|
6|   60|0.5555555555555556|
7|   70|0.6666666666666666|
8|   80|0.7777777777777778|
9|   90|0.8888888888888888|
10|  100|               1.0|

4.2.11.19. PERCENTILE_CONT

语法

PERCENTILE_CONT(percentile) WITHIN GROUP (ORDER BY expr [ DESC | ASC ])
[ OVER (query_partition_clause) ]
描述
该函数用于计算给定百分位数,它根据指定的百分比插值计算出连续型列的值。

警告

统一SQL暂未支持分析函数用法的解析

4.2.11.20. PERCENTILE_DISC

语法

PERCENTILE_DISC(expr1) WITHIN GROUP (ORDER BY expr2 [ DESC | ASC ])
[ OVER (query_partition_clause) ]
描述
该函数用于计算给定百分位数,它返回在排序后的数据集中,指定百分位数位置的实际值。

警告

统一SQL暂未支持分析函数用法的解析

4.2.11.21. RANK

语法

/*聚合语法*/
RANK(expr [, expr ]...) WITHIN GROUP( ORDER BY expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ] [, expr_col [ DESC | ASC ][ NULLS { FIRST | LAST } ]]...)

/*分析语法*/
RANK() OVER ([ query_partition_clause ] order_by_clause)
描述
该函数用于计算一个值在一组值的排名。当有相同排序值时,将会有相同的排名,并且值相同的行数会被记录到下个排名中。可以将此函数用作聚合或分析函数

说明

  • 作为聚合函数,RANK 计算由参数 expr 标识的假设行相对于指定排序规范的排名。参数表达式 expr 和 ORDER BY 聚合子句中的表达式按位置匹配。因此,参数的数量必须相同,并且它们的数据类型必须兼容。

  • 作为分析函数,RANK 计算从查询相对于由查询返回的其他行返回的每一行的秩,基于所述值 value_exprs 中 order_by_clause。

参数解释

参数

说明

expr

指定要查询的值。

expr_col

指定要查询的值对应的列名。

DESC | ASC

指定列表的排序方式,为可选项。ASC 为升序排序,默认值。DESC 为降序排序。

NULLS { FIRST | LAST }

排序后 expr_col 中 NULL 值的位置,为可选项。NULLS FIRST 表示 NULL 值排在非空值的前面。NULLS LAST 表示 NULL 值排在非空值的后面,为默认值。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 计算值的排名
-- 转换前Oracle SQL:
SELECT value, RANK() OVER (ORDER BY value) AS value_rank FROM unisql_test_data;
VALUE|VALUE_RANK|
-----+----------+
   10|         1|
   20|         2|
   30|         3|
   40|         4|
   50|         5|
   60|         6|
   70|         7|
   80|         8|
   90|         9|
  100|        10|


-- 转换后LightDB-Oracle SQL:
SELECT value,RANK() OVER (ORDER BY value) AS value_rank FROM unisql_test_data
value|value_rank|
-----+----------+
   10|         1|
   20|         2|
   30|         3|
   40|         4|
   50|         5|
   60|         6|
   70|         7|
   80|         8|
   90|         9|
  100|        10|


-- 转换前Oracle SQL:
SELECT department_id, name, salary,RANK() OVER (PARTITION BY department_id ORDER BY salary) RANK FROM unisql_employee ORDER BY RANK, name;
DEPARTMENT_ID|NAME |SALARY|RANK|
-------------+-----+------+----+
            2|ADA  | 20000|   1|
            1|JACK |  5000|   1|
            3|KATE | 50000|   1|
            2|TINA | 30000|   2|
            1|TOM  | 10000|   2|
            1|LINDA| 15000|   3|

-- 转换后LightDB-Oracle SQL:
SELECT department_id,name,salary,RANK() OVER (PARTITION BY department_id ORDER BY salary) AS RANK FROM unisql_employee ORDER BY RANK,name
department_id|name |salary|rank|
-------------+-----+------+----+
            2|ADA  | 20000|   1|
            1|JACK |  5000|   1|
            3|KATE | 50000|   1|
            2|TINA | 30000|   2|
            1|TOM  | 10000|   2|
            1|LINDA| 15000|   3|

4.2.11.22. STDDEV

语法

STDDEV([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]
描述
该函数用于计算一组数值型数据标准差

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

DISTINCT | ALL

查询时是否去重。为可选项,默认值 ALL。ALL:全部数值列。DISTINCT:去重关键字,表示计算唯一值的总体标准差。

expr

数值类型或者可以转换成数值类型的值。

OVER

使用 OVER 子句定义窗口进行计算

示例

CREATE TABLE unisql_test_data (
 id int PRIMARY KEY,
 value INTEGER
);

INSERT INTO unisql_test_data(id,value) VALUES (1,10);
INSERT INTO unisql_test_data(id,value) VALUES (2,20);
INSERT INTO unisql_test_data(id,value) VALUES (3,30);
INSERT INTO unisql_test_data(id,value) VALUES (4,40);
INSERT INTO unisql_test_data(id,value) VALUES (5,50);
INSERT INTO unisql_test_data(id,value) VALUES (6,60);
INSERT INTO unisql_test_data(id,value) VALUES (7,70);
INSERT INTO unisql_test_data(id,value) VALUES (8,80);
INSERT INTO unisql_test_data(id,value) VALUES (9,90);
INSERT INTO unisql_test_data(id,value) VALUES (10,100);

-- 样本标准偏差:计算 value 列的标准偏差
-- 转换前Oracle SQL:
SELECT STDDEV(value) OVER () AS standard_deviation_value FROM unisql_test_data;
STANDARD_DEVIATION_VALUE                 |
-----------------------------------------+
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|

-- 转换后LightDB-Oracle SQL:
SELECT STDDEV(value) OVER () AS standard_deviation_value FROM unisql_test_data
standard_deviation_value|
------------------------+
      30.2765035409749167|
      30.2765035409749167|
      30.2765035409749167|
      30.2765035409749167|
      30.2765035409749167|
      30.2765035409749167|
      30.2765035409749167|
      30.2765035409749167|
      30.2765035409749167|
      30.2765035409749167|

4.2.11.23. STDDEV_POP

语法

STDDEV_POP( [ALL] expr) [ OVER (analytic_clause) ]
描述
该函数将数值型数据作为参数计算总体标准差。总体标准差是总体方差的算术平方根。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

ALL

指定全部数值列,为可选项。默认值为 ALL。

expr

数值类型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)或者可以转换成数值类型的表达式。

OVER

使用 OVER 子句定义窗口进行计算。

示例

-- 总体标准偏差:计算 value 列的总体标准偏差
-- 转换前Oracle SQL:
SELECT STDDEV_POP(value) OVER () AS population_standard_deviation_value FROM unisql_test_data;
POPULATION_STANDARD_DEVIATION_VALUE     |
----------------------------------------+
28.7228132326901432992530573410946465911|
28.7228132326901432992530573410946465911|
28.7228132326901432992530573410946465911|
28.7228132326901432992530573410946465911|
28.7228132326901432992530573410946465911|
28.7228132326901432992530573410946465911|
28.7228132326901432992530573410946465911|
28.7228132326901432992530573410946465911|
28.7228132326901432992530573410946465911|
28.7228132326901432992530573410946465911|

-- 转换后LightDB-Oracle SQL:
SELECT stddev_pop(value) OVER () AS population_standard_deviation_value FROM unisql_test_data
population_standard_deviation_value|
-----------------------------------+
               28.7228132326901433|
               28.7228132326901433|
               28.7228132326901433|
               28.7228132326901433|
               28.7228132326901433|
               28.7228132326901433|
               28.7228132326901433|
               28.7228132326901433|
               28.7228132326901433|
               28.7228132326901433|

4.2.11.24. STDDEV_SAMP

语法

STDDEV_SAMP([ALL] expr) [ OVER (analytic_clause) ]
描述
该函数将数值型数据作为参数计算样本标准差,样本标准差是样本方差的算术平方根。STDDEV_SAMP 与函数 STDDEV 的不同之处在于,STDDEV 只有一行输入数据时返回 0,而 STDDEV_SAMP 返回 NULL。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

ALL

全部数值列。为可选项,默认值 ALL。

expr

数值类型(NUMBER、FLOAT、BINARY_FLOAT 和 BINARY_DOUBLE)或者可以转换成数值类型的表达式。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 样本标准偏差
-- 转换前Oracle SQL:
SELECT STDDEV_SAMP(value) OVER () AS sample_standard_deviation_value FROM unisql_test_data;
SAMPLE_STANDARD_DEVIATION_VALUE          |
-----------------------------------------+
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|
30.27650354097491665422532809718193699195|

-- 转换后LightDB-Oracle SQL:
SELECT STDDEV_SAMP(value) OVER () AS sample_standard_deviation_value FROM unisql_test_data
sample_standard_deviation_value|
-------------------------------+
            30.2765035409749167|
            30.2765035409749167|
            30.2765035409749167|
            30.2765035409749167|
            30.2765035409749167|
            30.2765035409749167|
            30.2765035409749167|
            30.2765035409749167|
            30.2765035409749167|
            30.2765035409749167|

4.2.11.25. SUM

语法
SUM([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]
描述
该函数返回指定参数的总和,可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

expr

指定参与计算的数值表达式。属于数值数据类型或可以隐式转换为数值数据类型的值。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 转换前Oracle SQL:
SELECT department_id, name, salary,SUM(salary) OVER (PARTITION BY department_id ORDER BY salary RANGE UNBOUNDED PRECEDING) l_csum FROM unisql_employee ORDER BY department_id, name, salary, l_csum;
DEPARTMENT_ID|NAME |SALARY|L_CSUM|
-------------+-----+------+------+
            1|JACK |  5000|  5000|
            1|LINDA| 15000| 30000|
            1|TOM  | 10000| 15000|
            2|ADA  | 20000| 20000|
            2|TINA | 30000| 50000|
            3|KATE | 50000| 50000|

-- 转换后LightDB-Oracle SQL:
SELECT department_id,name,salary,SUM(salary) OVER (PARTITION BY department_id ORDER BY salary) AS l_csum FROM unisql_employee ORDER BY department_id,name,salary,l_csum
department_id|name |salary|l_csum|
-------------+-----+------+------+
            1|JACK |  5000|  5000|
            1|LINDA| 15000| 30000|
            1|TOM  | 10000| 15000|
            2|ADA  | 20000| 20000|
            2|TINA | 30000| 50000|
            3|KATE | 50000| 50000|

4.2.11.26. VAR_POP

语法
VAR_POP(expr) [ OVER (analytic_clause) ]
描述
该函数返回一组数值集合的总体方差(忽略 NULL)。可以将该函数用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

expr

指定参与计算的数值表达式。属于数值数据类型或可以隐式转换为数值数据类型的值。

OVER

使用 OVER 子句定义窗口进行计算。

示例

-- 转换前Oracle SQL:
SELECT department_id, name, salary,
VAR_POP(salary) OVER (PARTITION BY department_id)
FROM unisql_employee GROUP BY department_id,name,salary;
DEPARTMENT_ID|NAME |SALARY|VAR_POP(SALARY)OVER(PARTITIONBYDEPARTMENT_ID)|
-------------+-----+------+---------------------------------------------+
            1|JACK |  5000|    16666666.66666666666666666666666666666667|
            1|LINDA| 15000|    16666666.66666666666666666666666666666667|
            1|TOM  | 10000|    16666666.66666666666666666666666666666667|
            2|ADA  | 20000|                                     25000000|
            2|TINA | 30000|                                     25000000|
            3|KATE | 50000|                                            0|

-- 转换后LightDB-Oracle SQL:
SELECT department_id,name,salary,var_pop(salary) OVER (PARTITION BY department_id) FROM unisql_employee GROUP BY department_id,name,salary
department_id|name |salary|var_pop              |
-------------+-----+------+---------------------+
            1|TOM  | 10000|16666666.666666666667|
            1|JACK |  5000|16666666.666666666667|
            1|LINDA| 15000|16666666.666666666667|
            2|TINA | 30000|             25000000|
            2|ADA  | 20000|             25000000|
            3|KATE | 50000|                    0|

4.2.11.27. VAR_SAMP

语法
VAR_SAMP(expr) [ OVER (analytic_clause) ]
描述
该函数返回一组数值集合的样本方差(忽略 NULL)。可以将该函数用作聚合或分析函数

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

expr

指定参与计算的数值表达式。属于数值数据类型或可以隐式转换为数值数据类型的值。

OVER

使用 OVER 子句定义窗口进行计算。

示例

-- 转换前Oracle SQL:
SELECT department_id, name, salary,
VAR_SAMP(SUM(SALARY)) OVER (PARTITION BY department_id)
FROM unisql_employee GROUP BY department_id,name,salary;
department_id | last_name | salary |       var_samp
DEPARTMENT_ID|NAME |SALARY|VAR_SAMP(SUM(SALARY))OVER(PARTITIONBYDEPARTMENT_ID)|
-------------+-----+------+---------------------------------------------------+
            1|JACK |  5000|                                           25000000|
            1|LINDA| 15000|                                           25000000|
            1|TOM  | 10000|                                           25000000|
            2|ADA  | 20000|                                           50000000|
            2|TINA | 30000|                                           50000000|
            3|KATE | 50000|                                                   |

-- 转换后LightDB-Oracle SQL:
SELECT department_id,name,salary,VAR_SAMP(SUM(SALARY)) OVER (PARTITION BY department_id) FROM unisql_employee GROUP BY department_id,name,salary
department_id|name |salary|var_samp|
-------------+-----+------+--------+
            1|TOM  | 10000|25000000|
            1|JACK |  5000|25000000|
            1|LINDA| 15000|25000000|
            2|TINA | 30000|50000000|
            2|ADA  | 20000|50000000|
            3|KATE | 50000|        |

4.2.11.28. VARIANCE

语法
VARIANCE([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]
描述
该函数功能是返回指定列的方差。可以将其用作聚合或分析函数。

说明

  • 作为分析函数使用时,需要使用 OVER 子句定义窗口进行计算。它对一组行的集合进行计算并返回多个值。

  • 作为聚合函数使用时,该函数对一组行的集合进行聚合计算,结果只能返回一个值,此时不需要加 OVER 子句。

参数解释

参数

说明

DISTINCT | ALL

查询时是否去重。为可选项,默认值 ALL。ALL:查询时不去除数据中的重复值,且忽略数据中的 NULL 值。DISTINCT:查询时去除数据中的重复值,且忽略数据中的 NULL 值。

expr

数值数据类型或任何可以隐式转换为数值数据类型的表达式。

OVER

使用 OVER 子句定义窗口进行计算

示例

-- 计算年龄的样本方差
-- 转换前Oracle SQL:
SELECT VARIANCE(value) OVER () AS population_variance_value FROM unisql_test_data;
POPULATION_VARIANCE_VALUE               |
----------------------------------------+
916.666666666666666666666666666666666667|
916.666666666666666666666666666666666667|
916.666666666666666666666666666666666667|
916.666666666666666666666666666666666667|
916.666666666666666666666666666666666667|
916.666666666666666666666666666666666667|
916.666666666666666666666666666666666667|
916.666666666666666666666666666666666667|
916.666666666666666666666666666666666667|
916.666666666666666666666666666666666667|


-- 转换后LightDB-Oracle SQL:
SELECT VARIANCE(value) OVER () AS population_variance_value FROM unisql_test_data;
population_variance_value|
-------------------------+
   916.6666666666666667|
   916.6666666666666667|
   916.6666666666666667|
   916.6666666666666667|
   916.6666666666666667|
   916.6666666666666667|
   916.6666666666666667|
   916.6666666666666667|
   916.6666666666666667|
   916.6666666666666667|

4.2.11.29. ROW_NUMBER

语法

ROW_NUMBER() OVER ([ query_partition_clause ] order_by_clause)

描述
该函数是一个分析函数,作用是为每一条行(分组)记录返回一个唯一的序号,该序号按照 order_by_clause 中指定列进行的排序,从 1 开始。当遇到相同的数据时,排名按照记录集中记录的顺序依次递增,对于不同数据进行依次排名。
-- 返回每个学生的行号
-- 转换前Oracle SQL:
SELECT name, ROW_NUMBER() OVER (ORDER BY name) AS row_num FROM unisql_students;
NAME     |ROW_NUM|
---------+-------+
Alice    |      1|
Bob      |      2|
Charlie  |      3|
David    |      4|
Emma     |      5|
Frank    |      6|
Grace    |      7|
Harry    |      8|
Isabella |      9|
Jack     |     10|
Katherine|     11|
Liam     |     12|
Mia      |     13|

-- 转换后LightDB-Oracle SQL:
SELECT name,ROW_NUMBER() OVER (ORDER BY name) AS row_num FROM unisql_students
name     |row_num|
---------+-------+
Alice    |      1|
Bob      |      2|
Charlie  |      3|
David    |      4|
Emma     |      5|
Frank    |      6|
Grace    |      7|
Harry    |      8|
Isabella |      9|
Jack     |     10|
Katherine|     11|
Liam     |     12|
Mia      |     13|

4.2.12. 序列、伪列

4.2.12.1. seq_name.nextval

该函数用于获取序列号的下一个sequence的值

-- 创建sequence
create sequence uni_seq increment by 1 start with 1;

-- 转换前Oracle SQL:
-- 获取下一个sequence的值
SELECT uni_seq.nextval FROM unisql_employee ke;
NEXTVAL|
-------+
      1|
      2|
      3|
      4|
      5|
      6|

-- 转换后LightDB-Oracle 创建sequence SQL:
CREATE SEQUENCE uni_seq INCREMENT BY 1 START WITH 1
-- 转换后LightDB-Oracle SQL:
SELECT uni_seq.nextval FROM unisql_employee AS ke
nextval|
-------+
      1|
      2|
      3|
      4|
      5|
      6|

4.2.12.2. ROWID

伪列

-- 转换前Oracle SQL:
SELECT ROWID,ke.* FROM unisql_employee ke;
ROWID             |EMPLOYEE_ID|NAME |SALARY|DEPARTMENT_ID|HIRE_DATE |COMMISSION_PCT|
------------------+-----------+-----+------+-------------+----------+--------------+
AAA2fQAAMAAIbD0AAA|          1|JACK |  5000|            1|2023-01-01|          0.05|
AAA2fQAAMAAIbD0AAB|          2|TOM  | 10000|            1|2023-02-01|          0.15|
AAA2fQAAMAAIbD0AAC|          3|LINDA| 15000|            1|2023-03-01|           0.2|
AAA2fQAAMAAIbD0AAD|          4|ADA  | 20000|            2|2023-04-01|           0.1|
AAA2fQAAMAAIbD0AAE|          5|TINA | 30000|            2|2023-05-01|           0.2|
AAA2fQAAMAAIbD0AAF|          6|KATE | 50000|            3|2023-06-01|           0.3|


-- 转换后LightDB-Oracle SQL:
SELECT ROWID,ke.* FROM unisql_employee AS ke
rowid|employee_id|name |salary|department_id|hire_date |commission_pct|
-----+-----------+-----+------+-------------+----------+--------------+
(0,1)|          1|JACK |  5000|            1|2023-01-01|          0.05|
(0,2)|          2|TOM  | 10000|            1|2023-02-01|          0.15|
(0,3)|          3|LINDA| 15000|            1|2023-03-01|           0.2|
(0,4)|          4|ADA  | 20000|            2|2023-04-01|           0.1|
(0,5)|          5|TINA | 30000|            2|2023-05-01|           0.2|
(0,6)|          6|KATE | 50000|            3|2023-06-01|           0.3|