5.2. 内置函数

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

使用时注意事项参考: 注意事项

5.2.1. 数字函数

5.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|

-- 转换后TDSQL-MySQL:
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|     0|     6.66|       3|

5.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|

-- 转换后TDSQL-MySQL:
SELECT 0&0,0&-1,0&NULL,1&2 FROM DUAL;
0&0|0&-1|0&NULL|1&2|
---+----+------+---+
0|   0|      |  0|

5.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|

-- 转换后TDSQL-MySQL:
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|

5.2.1.4. DBMS_RANDOM.VALUE

语法
DBMS_RANDOM.VALUE
描述
返回一个随机码,此随机码需满足大于或等于 0,小于 1

参数解释

示例

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

-- 转换后TDSQL-MySQL:
SELECT rand() FROM dual;
rand()            |
------------------+
0.2516990529854773|

5.2.1.5. DBMS_RANDOM.RANDOM

语法
DBMS_RANDOM.RANDOM
描述
返回一个在 [-2^31,2^31)范围区间内的随机整数

参数解释

示例

-- 转换前Oracle SQL:
SELECT DBMS_RANDOM.RANDOM from dual;
RANDOM    |
----------+
-886930169|

-- 转换后TDSQL-MySQL:
SELECT floor(power(-2, 31)+rand()*power(2, 32)) FROM dual;
floor(power(-2, 31)+rand()*power(2, 32))|
----------------------------------------+
                           -278630359|

5.2.1.6. EXP

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

参数解释

参数

说明

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|

-- 转换后TDSQL-MySQL:
SELECT EXP(1),EXP(0),EXP(NULL),EXP(2) FROM DUAL;
EXP(1)           |EXP(0)|EXP(NULL)|EXP(2)          |
-----------------+------+---------+----------------+
2.718281828459045|   1.0|         |7.38905609893065|

5.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|

-- 转换后TDSQL-MySQL
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|

5.2.1.8. LN

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

参数解释

参数

说明

numeric_expression

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

示例

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

-- 转换后TDSQL-MySQL
SELECT LN(3.0) AS `Natural Logarithm` FROM dual;
Natural Logarithm |
------------------+
1.0986122886681098|

5.2.1.9. 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|

-- 转换后TDSQL-MySQL
SELECT power(2, 3),POWER(3, 2) AS `Raised` FROM dual;
power(2, 3)|Raised|
-----------+------+
      8.0|   9.0|

5.2.1.10. SIGN

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

参数解释

参数

说明

numeric_expression

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

返回类型
  • 如果 numeric_expression > 0,则返回 1

  • 如果 numeric_expression < 0,则返回 -1

  • 如果 numeric_expression = 0,则返回 0

示例

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

-- 转换后TDSQL-MySQL
SELECT sign(20),SIGN(0),SIGN(-1),SIGN(-15) AS `sign` FROM dual;
sign(20)|SIGN(0)|SIGN(-1)|sign|
--------+-------+--------+----+
      1|      0|      -1|  -1|

5.2.1.11. 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|          |

-- 转换后TDSQL-MySQL:
SELECT sqrt(20),sqrt(0),sqrt(1),sqrt(2),sqrt(NULL) FROM DUAL;
sqrt(20)        |sqrt(0)|sqrt(1)|sqrt(2)           |sqrt(NULL)|
----------------+-------+-------+------------------+----------+
4.47213595499958|    0.0|    1.0|1.4142135623730951|          |

5.2.1.12. MOD

语法
MOD(N,M)
描述
取余函数

参数解释

参数

说明

N

被除数

M

除数

示例

-- 转换前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

-- 转换后TDSQL-MySQL:
SELECT if(concat('a', 4)='a0', 11, MOD(11, 4)) AS `Modulus`,if(concat('a', 4)='a0', 11, MOD(11, 4)),if(concat('a', -4)='a0', 11, MOD(11, -4)),if(concat('a', 4)='a0', -11, MOD(-11, 4)),if(concat('a', -4)='a0', -11, MOD(-11, -4)) FROM DUAL;
Modulus|if(concat('a', 4)='a0', 11, MOD(11, 4))|if(concat('a', -4)='a0', 11, MOD(11, -4))|if(concat('a', 4)='a0', -11, MOD(-11, 4))|if(concat('a', -4)='a0', -11, MOD(-11, -4))|
-------+---------------------------------------+-----------------------------------------+-----------------------------------------+-------------------------------------------+
      3|                                      3|                                        3|                                       -3|                                         -3|

5.2.1.13. ROUND

语法

ROUND(X)
ROUND(X,D)
描述
返回一个数值,四舍五入到指定的长度或精度

参数解释

参数

说明

X

要操作的数值

D

返回的长度或精度

示例

-- 转换前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.0000000000 |  15.2 |    20 | 0.0000000000 | -3.0000000000 |    10

-- 转换后TDSQL-MySQL
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|

5.2.1.14. TRUNC(number)

语法
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|

-- 转换后TDSQL-MySQL:
SELECT truncate(555.666, 2.2),truncate(555.666, -2),truncate(555.666, 0) FROM DUAL;
truncate(555.666, 2.2)|truncate(555.666, -2)|truncate(555.666, 0)|
----------------------+---------------------+--------------------+
               555.66|                  500|                 555|

5.2.2. 字符串函数

5.2.2.1. CHR

语法
CHR(n)
描述
该函数根据数字参数返回字符,返回值与当前系统的字符集相关

参数解释

参数

说明

n

字符的数字代码,是一个整数值,范围为 [32,127]

示例

-- 转换前Oracle SQL:
select CHR(67),CHR(68) from dual;
CHR(67)|CHR(68)|
-------+-------+
C      |D      |

-- 转换后TDSQL-MySQL:
SELECT char(67),char(68) FROM dual;
char(67)|char(68)|
--------+--------+
C       |D       |

5.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!            |

-- 转换后TDSQL-MySQL:
SELECT CONCAT('Hello', ', world!') FROM DUAL;
CONCAT('Hello', ', world!')|
---------------------------+
Hello, world!              |

5.2.2.3. LOWER

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

参数解释

参数

说明

char

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

示例

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

-- 转换后TDSQL-MySQL:
SELECT LOWER('AaBbCcDd') AS `Lowercase` FROM DUAL;
Lowercase|
---------+
aabbccdd |

5.2.2.4. 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 |

-- 转换后TDSQL-MySQL:
SELECT REPLACE('unisql', 'u', 'U') AS `replace` FROM DUAL;
replace|
-------+
Unisql |

5.2.2.5. UPPER

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

参数解释

参数

说明

char

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

示例

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

-- 转换后TDSQL-MySQL:
SELECT UPPER('unisql') AS `UPPER` FROM DUAL;
UPPER |
------+
UNISQL|

5.2.2.6. REVERSE

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

参数解释

参数

说明

str

要倒序的字符串

示例

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

-- 转换后TDSQL-MySQL:
SELECT REVERSE('unIsql') FROM DUAL;
REVERSE('unIsql')|
-----------------+
lqsInu           |

5.2.2.7. 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|         |           |

-- 转换后TDSQL-MySQL:
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|           |

5.2.2.8. LENGTH

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

参数解释

参数

说明

str

要操作的字符串

示例

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

-- 转换后TDSQL-MySQL:
SELECT char_length('中国'),char_length('hello') FROM DUAL
char_length('中国')|char_length('hello')|
-----------------+--------------------+
               2|                   5|

-- 在Oracle中,\\n会被视为两个字符,在Mysql中,\\n会被视为一个字符,下面语句执行后会返回6
-- 转换前Oracle SQL:
SELECT LENGTH('abc\n\t\r') FROM dual
LENGTH('ABC\N\T\R')|
-------------------+
                  9|

-- 转换后TDSQL-MySQL:
SELECT char_length('abc\n\t\r') FROM dual;
char_length('abc\n\t\r')|
------------------------+
                     6|

5.2.2.9. LENGTHB

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

参数解释

参数

说明

str

要操作的字符串

示例

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

-- 转换后TDSQL-MySQL:
SELECT length('中国'),char_length('hello') FROM DUAL;
length('中国')|char_length('hello')|
------------+--------------------+
         6|                   5|

-- 在Oracle中,\\n会被视为两个字节长度,在Mysql中,\\n会被视为一个字节长度,下面语句执行后会返回6
-- 转换前Oracle SQL:
SELECT LENGTHB('abc\n\t\r') FROM dual;
LENGTHB('ABC\N\T\R')|
--------------------+
                   9|

-- 转换后TDSQL-MySQL:
SELECT length('abc\n\t\r') FROM dual;
length('abc\n\t\r')|
-------------------+
                  6|

5.2.2.10. 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                          |                     |          |

-- 转换后TDSQL-MySQL:
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' FROM NULL)|TRIM(NULL)|
-------------+----------------------------------+-------------------------------+-----------------------------------+------------------------+----------+
bar          |barxxx                            |bar                            |xxxbar                             |                        |          |

5.2.2.11. 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              |                 |              |               |

-- 转换后TDSQL-MySQL:
SELECT
   if(length('1223')>=3, LPAD('1223', 3, ''), '1223'),
   if(length('1223')>=4, LPAD('1223', 4, ''), '1223'),
   if(length('1223')>=5, LPAD('1223', 5, ''), '1223'),
   if('2+1' IS NULL OR length('2+1')=0, lpad('1223', 6, NULL), LPAD('1223', 6, '2+1')),
   if('' IS NULL OR length('')=0, lpad('1223', 7, NULL), LPAD('1223', 7, '')),
   if(length('1223')>=0, LPAD('1223', 0, ''), '1223'),
   if(length('1223')>=-1, LPAD('1223', -1, ''), '1223')
FROM dual;
if(length('1223')>=3, LPAD('1223', 3, ''), '1223')|if(length('1223')>=4, LPAD('1223', 4, ''), '1223')|if(length('1223')>=5, LPAD('1223', 5, ''), '1223')|if('2+1' IS NULL OR length('2+1')=0, lpad('1223', 6, NULL), LPAD('1223', 6, '2+1'))|if('' IS NULL OR length('')=0, lpad('1223', 7, NULL), LPAD('1223', 7, ''))|if(length('1223')>=0, LPAD('1223', 0, ''), '1223')|if(length('1223')>=-1, LPAD('1223', -1, ''), '1223')|
--------------------------------------------------+--------------------------------------------------+--------------------------------------------------+-----------------------------------------------------------------------------------+--------------------------------------------------------------------------+--------------------------------------------------+----------------------------------------------------+
122                                               |1223                                              |1223                                              |2+1223                                                                             |                                                                          |                                                  |                                                    |

5.2.2.12. 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+              |                 |              |               |

-- 转换后TDSQL-MySQL:
SELECT
   if(length('1223')>=3, RPAD('1223', 3, ''), '1223'),
   if(length('1223')>=4, RPAD('1223', 4, ''), '1223'),
   if(length('1223')>=5, RPAD('1223', 5, ''), '1223'),
   if('2+1' IS NULL OR length('2+1')=0, rpad('1223', 6, NULL), RPAD('1223', 6, '2+1')),
   if('' IS NULL OR length('')=0, rpad('1223', 7, NULL), RPAD('1223', 7, '')),
   if(length('1223')>=0, RPAD('1223', 0, ''), '1223'),if(length('1223')>=-1, RPAD('1223', -1, ''), '1223')
FROM dual;
if(length('1223')>=3, RPAD('1223', 3, ''), '1223')|if(length('1223')>=4, RPAD('1223', 4, ''), '1223')|if(length('1223')>=5, RPAD('1223', 5, ''), '1223')|if('2+1' IS NULL OR length('2+1')=0, rpad('1223', 6, NULL), RPAD('1223', 6, '2+1'))|if('' IS NULL OR length('')=0, rpad('1223', 7, NULL), RPAD('1223', 7, ''))|if(length('1223')>=0, RPAD('1223', 0, ''), '1223')|if(length('1223')>=-1, RPAD('1223', -1, ''), '1223')|
--------------------------------------------------+--------------------------------------------------+--------------------------------------------------+-----------------------------------------------------------------------------------+--------------------------------------------------------------------------+--------------------------------------------------+----------------------------------------------------+
122                                               |1223                                              |1223                                              |12232+                                                                             |                                                                          |                                                  |                                                    |

5.2.2.13. 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                 |                      |

-- 转换后TDSQL-MySQL:
SELECT substr('abcdefg', if(3=0, 1, 3), length('abcdefg')),substr('abcdefg', if(3=0, 1, 3), 2),substr('abcdefg', if(-3=0, 1, -3), length('abcdefg')),substr('abcdefg', if(3=0, 1, 3), -2) FROM DUAL;
substr('abcdefg', if(3=0, 1, 3), length('abcdefg'))|substr('abcdefg', if(3=0, 1, 3), 2)|substr('abcdefg', if(-3=0, 1, -3), length('abcdefg'))|substr('abcdefg', if(3=0, 1, 3), -2)|
---------------------------------------------------+-----------------------------------+-----------------------------------------------------+------------------------------------+
cdefg                                              |cd                                 |efg                                                  |                                    |

5.2.2.14. 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|

-- 转换后TDSQL-MySQL:
SELECT instr('Unisql', if(BINARY 'U'='', NULL, BINARY 'U')) AS `i1`,instr('Unisql', if(BINARY 'u'='', NULL, BINARY 'u')) AS `i2`,instr('Unisql', if(BINARY 'n'='', NULL, BINARY 'n')) AS `i3`,instr('Unisql', if(BINARY 'a'='', NULL, BINARY 'a')) AS `i4`,instr('Unisql', if(BINARY ''='', NULL, BINARY '')) AS `i5`,instr('Unisql', if(BINARY NULL='', NULL, BINARY NULL)) AS `i6`,instr('foobarbar', if(BINARY 'bar'='', NULL, BINARY 'bar')) AS `i7`,instr('xbar', if(BINARY 'foobar'='', NULL, BINARY 'foobar')) AS `i8`,instr('北京欢迎你', if(BINARY '北'='', NULL, BINARY '北')) AS `i9` FROM DUAL;
i1|i2|i3|i4|i5|i6|i7|i8|i9|
--+--+--+--+--+--+--+--+--+
1| 0| 2| 0|  |  | 4| 0| 1|

5.2.2.15. 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         |

-- 转换后TDSQL-MySQL:
SELECT `unisql`.unisql_ltrim(' 2023-09-21 ', ' 0123'),`unisql`.unisql_ltrim('  2023-09-21', ' ') FROM DUAL
`unisql`.unisql_ltrim(' 2023-09-21 ', ' 0123')|`unisql`.unisql_ltrim('  2023-09-21', ' ')|
----------------------------------------------+------------------------------------------+
-09-21                                        |2023-09-21                                |

5.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       |

-- 转换后TDSQL-MySQL:
SELECT `unisql`.unisql_rtrim(' 2023-09-21 ', ' 0123'),`unisql`.unisql_rtrim('  2023-09-21', ' ') FROM DUAL
`unisql`.unisql_rtrim(' 2023-09-21 ', ' 0123')|`unisql`.unisql_rtrim('  2023-09-21', ' ')|
----------------------------------------------+------------------------------------------+
2023-09-                                     |  2023-09-21                              |

5.2.2.17. 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                                          |

-- 转换后TDSQL-MySQL:
SELECT `unisql`.`unisql_regexp_substr`('a11a22a33a44', 'a[[:digit:]]+', 1, 1) FROM dual;
`unisql`.`unisql_regexp_substr`('a11a22a33a44', 'a[[:digit:]]+', 1, 1)|
----------------------------------------------------------------------+
a11                                                                   |


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

-- 转换后TDSQL-MySQL:
SELECT `unisql`.`unisql_regexp_substr`('a11a22a33a44', 'a[[:digit:]]+', 1, 1) FROM dual;
`unisql`.`unisql_regexp_substr`('a11a22a33a44', 'a[[:digit:]]+', 1, 1)|
----------------------------------------------------------------------+
a11                                                                   |


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

-- 转换后TDSQL-MySQL:
SELECT `unisql`.`unisql_regexp_substr`('a11a22a33a44', 'a[[:digit:]]+', 1, 2) FROM DUAL;
`unisql`.`unisql_regexp_substr`('a11a22a33a44', 'a[[:digit:]]+', 1, 2)|
----------------------------------------------------------------------+
a22                                                                   |

5.2.3. 时间日期函数

5.2.3.1. 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|

-- 转换后TDSQL-MySQL:
SELECT `unisql`.unisql_trunc(CAST(str_to_date('2022/04/19 10:32:34', '%Y/%m/%d %H:%i:%s') AS DATETIME), 'YEAR'),`unisql`.unisql_trunc(CAST(str_to_date('2022/04/19 10:32:34', '%Y/%m/%d %H:%i:%s') AS DATETIME), 'MONTH'),`unisql`.unisql_trunc(CAST(str_to_date('2022/04/19 10:32:34', '%Y/%m/%d %H:%i:%s') AS DATETIME), 'DDD') FROM DUAL;
`unisql`.unisql_trunc(CAST(str_to_date('2022/04/19 10:32:34', '%Y/%m/%d %H:%i:%s') AS DATETIME), 'YEAR')|`unisql`.unisql_trunc(CAST(str_to_date('2022/04/19 10:32:34', '%Y/%m/%d %H:%i:%s') AS DATETIME), 'MONTH')|`unisql`.unisql_trunc(CAST(str_to_date('2022/04/19 10:32:34', '%Y/%m/%d %H:%i:%s') AS DATETIME), 'DDD')|
--------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------+
                                                                                 2022-01-01 00:00:00.000|                                                                                  2022-04-01 00:00:00.000|                                                                                2022-04-19 00:00:00.000|

5.2.3.2. 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 00:59:15.000|                     2023-09-30 00:00:00.000|

-- 转换后TDSQL-MySQL:
SELECT date_add(last_day(current_timestamp()), INTERVAL date_format(current_timestamp(), '%H:%i:%s') HOUR_SECOND),date_add(last_day(CAST(str_to_date('2023/09/21', '%Y/%m/%d') AS DATETIME)), INTERVAL date_format(CAST(str_to_date('2023/09/21', '%Y/%m/%d') AS DATETIME), '%H:%i:%s') HOUR_SECOND) FROM DUAL;
date_add(last_day(current_timestamp()), INTERVAL date_format(current_timestamp(), '%H:%i:%s') HOUR_SECOND)|date_add(last_day(CAST(str_to_date('2023/09/21', '%Y/%m/%d') AS DATETIME)), INTERVAL date_format(CAST(str_to_date('2023/09/21', '%Y/%m/%d') AS DATETIME), '%H:%i:%s') HOUR_SECOND)|
----------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
                                                                                 2023-12-31 00:59:15.000|                                                                                                                                                           2023-09-30 00:00:00.000|

5.2.3.3. 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|

-- 转换后TDSQL-MySQL:
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|    38|    40|  6|    9|2023|

5.2.3.4. SYSDATE

语法
SYSDATE
描述
返回当前日期和时间,MySQL相关数据库可指定时区设置,影响此函数的返回值
参数解释

示例

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

-- 转换后TDSQL-MySQL:
SELECT CURRENT_TIMESTAMP() FROM DUAL;
CURRENT_TIMESTAMP()    |
-----------------------+
2024-02-02 14:31:05.000|

5.2.3.5. TO_CHAR (datetime)

语法
TO_CHAR({ datetime} [, fmt])
描述
该函数将日期时间按照参数 fmt 指定的格式转换为 VARCHAR2 数据类型的值

参数解释

参数

说明

datetime

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

fmt

指定输出格式

示例

-- 转换前Oracle SQL:
SELECT
TO_CHAR(TO_DATE('2023-04-20', 'YYYY-MM-DD'),'YYYY-MM-DD') AS a1
FROM DUAL;
A1        |
----------+
2023-04-20|

-- 转换后TDSQL-MySQL:
SELECT date_format(CAST(str_to_date('2023-04-20', '%Y-%m-%d') AS DATETIME), '%Y-%m-%d') AS `a1` FROM DUAL
a1        |
----------+
2023-04-20|

5.2.3.6. TO_TIMESTAMP

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

参数解释

参数

说明

datetime

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

fmt

指定输出格式

示例

-- 转换前Oracle SQL:
SELECT
   to_timestamp('2020-02-02', 'yyyy-mm-dd') AS a1,
   to_timestamp('2020-02-02 02', 'yyyy-mm-dd hh24') AS a2
FROM
   dual
A1                     |A2                     |
-----------------------+-----------------------+
2020-02-02 00:00:00.000|2020-02-02 02:00:00.000|

-- 转换后TDSQL-MySQL:
SELECT CAST(str_to_date('2020-02-02', '%Y-%m-%d') AS DATETIME(6)) AS `a1`,CAST(str_to_date('2020-02-02 02', '%Y-%m-%d %H') AS DATETIME(6)) AS `a2` FROM dual;
a1                     |a2                     |
-----------------------+-----------------------+
2020-02-02 00:00:00.000|2020-02-02 02:00:00.000|

5.2.3.7. CURRENT_DATE

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

参数解释

示例

-- 转换前Oracle SQL:
SELECT CURRENT_DATE FROM DUAL;
-----------------------+
CURRENT_DATE           |
-----------------------+
2023-12-20 19:11:29.000|

-- 转换后TDSQL-MySQL:
SELECT current_timestamp(0) FROM DUAL;
current_timestamp(0)   |
-----------------------+
2023-12-20 19:11:29.000|

5.2.3.8. CURRENT_TIMESTAMP

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

参数解释

示例

-- 转换前Oracle SQL:
SELECT CURRENT_TIMESTAMP FROM DUAL;
CURRENT_TIMESTAMP            |
-----------------------------+
2023-12-20 19:04:55.457 +0800|

-- 转换后TDSQL-MySQL:
SELECT CURRENT_TIMESTAMP() FROM DUAL;
CURRENT_TIMESTAMP()    |
-----------------------+
2023-12-20 19:04:55.457|

5.2.3.9. 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|


-- 转换后TDSQL-MySQL:
SELECT
date_add(CAST(str_to_date('2023-12-21', '%Y-%m-%d') AS DATETIME), INTERVAL floor(-3) MONTH) AS `a1`,
date_add(CAST(str_to_date('2023-12-21', '%Y-%m-%d') AS DATETIME), INTERVAL floor(3) MONTH) AS `a2`,
date_add(CAST(str_to_date('2023-12-21', '%Y-%m-%d') AS DATETIME), INTERVAL floor(1.1) MONTH) AS `a3`,
date_add(CAST(str_to_date('2023-12-21', '%Y-%m-%d') AS DATETIME), INTERVAL floor(1.5) MONTH) AS `a4`,
date_add(CAST(str_to_date('2023-12-21', '%Y-%m-%d') AS DATETIME), INTERVAL floor(1.8) MONTH) AS `a5`,
date_add(CAST(str_to_date('2023-12-21', '%Y-%m-%d') AS DATETIME), INTERVAL floor(0) MONTH) 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|

5.2.4. 通用比较函数

5.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                         |

-- 转换后TDSQL-MySQL:
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                          |

5.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                      |

-- 转换后TDSQL-MySQL:
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                       |

5.2.5. 转换函数

5.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 NUMBER

yes

yes

yes

no

no

yes

警告

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

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

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

  • 在TDSQL-MySQL中,CAST to NUMBER的时候存在四舍五入的情况,请使用CAST函数时注意目标类型的精度。

示例

-- 转换前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|

-- 转换后TDSQL-MySQL:
SELECT CAST('100.2345' AS DECIMAL) AS `to_nu`,CAST('100.2345' AS DECIMAL) AS `to_nu`,CAST('100.2345' AS DECIMAL(38, 0)) AS `to_nu`,CAST('100.2345' AS DECIMAL(38, 2)) AS `to_nu`,CAST('100.2345' AS DECIMAL(4)) AS `to_nu`,CAST('100.2345' AS DECIMAL(4)) AS `to_nu`,CAST('100.2345' AS DECIMAL(9)) AS `to_nu`,CAST('100.2345' AS DECIMAL(9)) AS `to_nu`,CAST('100.2345' AS DECIMAL(18)) AS `to_nu`,CAST('100.2345' AS DECIMAL(18)) AS `to_nu`,CAST('100.2345' AS DECIMAL(38)) AS `to_nu`,CAST('100.2345' AS DECIMAL(38)) AS `to_nu`,CAST('100.2345' AS DECIMAL(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 DECIMAL(38, 0)) AS `to_numr`,CAST('100.2345' AS DECIMAL(38, 0)) AS `to_numr`,CAST('100.2345' AS DECIMAL(38, 0)) AS `to_numr`,CAST('100.2345' AS DECIMAL(38, 2)) AS `to_numr`,CAST('100.2345' AS DECIMAL(4)) AS `to_numr`,CAST('100.2345' AS DECIMAL(4)) AS `to_numr`,CAST('100.2345' AS DECIMAL(9)) AS `to_numr`,CAST('100.2345' AS DECIMAL(9)) AS `to_numr`,CAST('100.2345' AS DECIMAL(18)) AS `to_numr`,CAST('100.2345' AS DECIMAL(18)) AS `to_numr`,CAST('100.2345' AS DECIMAL(38)) AS `to_numr`,CAST('100.2345' AS DECIMAL(38)) AS `to_numr`,CAST('100.2345' AS DECIMAL(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|  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|    100|    100|    100| 100.23|    100|    100|    100|    100|    100|    100|    100|    100| 100.23|

5.2.5.2. TO_DATE

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

参数解释

参数

说明

char

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

fmt

指定 char 的时间格式

示例

-- 转换前Oracle SQL:
SELECT
to_date('2020-02-02', 'yyyy-mm-dd') as a1,
to_date('2020-02-02 0201', 'yyyy-mm-dd hh24mi')as a2
FROM DUAL
A1                     |A2                     |
-----------------------+-----------------------+
2020-02-02 00:00:00.000|2020-02-02 02:01:00.000|

-- 转换后TDSQL-MySQL:
SELECT CAST(str_to_date('2020-02-02', '%Y-%m-%d') AS DATETIME) AS `a1`,CAST(str_to_date('2020-02-02 0201', '%Y-%m-%d %H%i') AS DATETIME) AS `a2` FROM DUAL;
a1                     |a2                     |
-----------------------+-----------------------+
2020-02-02 00:00:00.000|2020-02-02 02:01:00.000|

5.2.5.3. 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|

-- 转换后TDSQL-MySQL:
SELECT CAST('0123456' AS DECIMAL(65, 30)),CAST('1.2' AS DECIMAL(65, 30)),CAST('0' AS DECIMAL(65, 30)),CAST(1.2 AS DECIMAL(65, 30)),CAST('-1' AS DECIMAL(65, 30)),CAST(-1 AS DECIMAL(65, 30)) FROM DUAL;
CAST('0123456' AS DECIMAL(65, 30))   |CAST('1.2' AS DECIMAL(65, 30))  |CAST('0' AS DECIMAL(65, 30))    |CAST(1.2 AS DECIMAL(65, 30))    |CAST('-1' AS DECIMAL(65, 30))    |CAST(-1 AS DECIMAL(65, 30))      |
-------------------------------------+--------------------------------+--------------------------------+--------------------------------+---------------------------------+---------------------------------+
123456.000000000000000000000000000000|1.200000000000000000000000000000|0.000000000000000000000000000000|1.200000000000000000000000000000|-1.000000000000000000000000000000|-1.000000000000000000000000000000|

5.2.5.4. TO_CLOB

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

参数解释

参数

说明

lob_column

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

char

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

示例

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

-- 转换后TDSQL-MySQL:
SELECT CAST('1' AS CHAR),CAST(0 AS CHAR),CAST(NULL AS CHAR),CAST('' AS CHAR) FROM DUAL
CAST('1' AS CHAR)|CAST(0 AS CHAR)|CAST(NULL AS CHAR)|CAST('' AS CHAR)|
-----------------+---------------+------------------+----------------+
1                |0              |                  |                |

5.2.6. 编码解码函数

5.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)大'),
      DECODE(INSTR('CLARK','S'), 0, '不含有 S', '含有 S') "CLARK",
 DECODE(INSTR('KING','S'), 0, '不含有 S', '含有 S') "KING",
 DECODE(INSTR('MILLER','S'), 0, '不含有 S', '含有 S') "MILLER",
 DECODE(INSTR('ADAMS','S'), 0, '不含有 S', '含有 S') "ADAMS",
 DECODE(INSTR('FORD','S'), 0, '不含有 S', '含有 S') "FORD",
 DECODE(INSTR('JONES','S'), 0, '不含有 S', '含有 S') "JONES"
 FROM DUAL;
DECODE(SIGN((5*3-2)-(3*4-1)),0,'相等',1,'(5*3-2)大','(3*4-1)大')|CLARK|KING |MILLER|ADAMS|FORD |JONES|
------------------------------------------------------------+-----+-----+------+-----+-----+-----+
(5*3-2)大                                                    |不含有 S|不含有 S|不含有 S |含有 S |不含有 S|含有 S |

-- 转换后TDSQL-MySQL:
SELECT CASE WHEN SIGN((5*3-2)-(3*4-1))=0 THEN '相等' WHEN SIGN((5*3-2)-(3*4-1))=1 THEN '(5*3-2)大' ELSE '(3*4-1)大' END,CASE WHEN strpos('CLARK', 'S')=0 THEN '不含有 S' ELSE '含有 S' END AS "CLARK",CASE WHEN strpos('KING', 'S')=0 THEN '不含有 S' ELSE '含有 S' END AS "KING",CASE WHEN strpos('MILLER', 'S')=0 THEN '不含有 S' ELSE '含有 S' END AS "MILLER",CASE WHEN strpos('ADAMS', 'S')=0 THEN '不含有 S' ELSE '含有 S' END AS "ADAMS",CASE WHEN strpos('FORD', 'S')=0 THEN '不含有 S' ELSE '含有 S' END AS "FORD",CASE WHEN strpos('JONES', 'S')=0 THEN '不含有 S' ELSE '含有 S' END AS "JONES"
case    |CLARK|KING |MILLER|ADAMS|FORD |JONES|
--------+-----+-----+------+-----+-----+-----+
(5*3-2)大|不含有 S|不含有 S|不含有 S |含有 S |不含有 S|含有 S |

5.2.7. 空值函数

5.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|

-- 转换后TDSQL-MySQL:
SELECT ifnull(10, '1'),ifnull(NULL, 1),ifnull(0/1, 1) FROM DUAL;
ifnull(10, '1')|ifnull(NULL, 1)|ifnull(0/1, 1)|
---------------+---------------+--------------+
10             |              1|        0.0000|

5.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                |

-- 转换后TDSQL-MySQL:
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                |

5.2.8. 环境和标识符函数

5.2.8.1. SYS_GUID

语法
SYS_GUID()
描述
该函数生成并返回由 16 个字节组成的全局唯一标识符,即生成一个全局唯一序列号。
这个全局唯一序列号通常是一个 RAW(原始) 数据类型。如果在客户端工具或应用程序中以文本形式显示,可能会看到乱码,因为 RAW 类型的数据在文本中可能不可读。可以使用 RAWTOHEX 函数将其转换为十六进制字符串。

参数解释

示例

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

-- 转换后TDSQL-MySQL:
SELECT uuid() FROM DUAL;
uuid()                              |
------------------------------------+
4744ece6-9f34-11ee-9bde-005056b27854|

5.2.8.2. USER

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

示例

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

-- 转换后TDSQL-MySQL:
SELECT user() FROM DUAL
user()                    |
--------------------------+
test@10.188.120.241|

5.2.9. 层次函数

暂不支持,建议业务调整

5.2.10. 聚合函数

5.2.10.1. AVG

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

说明

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

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

警告

统一SQL暂时不支持AVG作为分析函数的用法,不支持over子句。

参数解释

参数

说明

DISTINCT ALL

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

expr

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

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|

-- 转换后TDSQL-MySQL:
SELECT AVG(salary) FROM unisql_employee;
AVG(`salary`)|
-------------+
   21666.6667|

5.2.10.2. CORR

语法
TDSQL-MySQL不支持

5.2.10.3. COUNT

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

说明

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

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

警告

统一SQL暂时不支持COUNT作为分析函数的用法,不支持over子句。

参数解释

参数

说明

DISTINCT ALL

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

expr

指定参与计算的列名

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|

-- 转换后TDSQL-MySQL:
SELECT count(1),count(1),count(`employee_id`),count(DISTINCT (`department_id`)) FROM `unisql_employee` AS `ke`;
count(1)|count(1)|count(`employee_id`)|count(DISTINCT (`department_id`))|
--------+--------+--------------------+---------------------------------+
      6|       6|                   6|                                3|

5.2.10.4. COVAR_POP

语法
TDSQL-MySQL不支持

5.2.10.5. COVAR_SAMP

语法
TDSQL-MySQL不支持

5.2.10.6. CUME_DIST

语法
TDSQL-MySQL不支持

5.2.10.7. DENSE_RANK

语法
TDSQL-MySQL不支持

5.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|

-- 转换后TDSQL-MySQL:
SELECT group_concat(`name` ORDER BY `employee_id`,`name` SEPARATOR '; ') AS `rk` FROM `unisql_employee` WHERE `department_id`=1;
rk              |
----------------+
JACK; TOM; LINDA|

5.2.10.9. MAX

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

说明

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

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

警告

统一SQL暂时不支持MAX作为分析函数的用法,不支持over子句。

参数解释

参数

说明

DISTINCT ALL

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

expr

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

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|

-- 转换后TDSQL-MySQL:
SELECT MAX(`salary`),MAX(1),MAX(DISTINCT `department_id`) FROM `unisql_employee` AS `ke`;
MAX(`salary`)|MAX(1)|MAX(DISTINCT `department_id`)|
-------------+------+-----------------------------+
      50000|     1|                            3|

5.2.10.10. MEDIAN

语法
TDSQL-MySQL不支持

5.2.10.11. MIN

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

说明

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

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

警告

统一SQL暂时不支持MIN作为分析函数的用法,不支持over子句。

参数解释

参数

说明

DISTINCT ALL

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

expr

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

OVER

暂时不支持

示例

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

-- 转换后TDSQL-MySQL:
SELECT MIN(`SALARY`),MIN(1),MIN(DISTINCT `department_id`) FROM `unisql_employee`
MIN(`SALARY`)|MIN(1)|MIN(DISTINCT `department_id`)|
-------------+------+-----------------------------+
         5000|     1|                            1|

5.2.10.12. PERCENT_RANK

语法
TDSQL-MySQL不支持

5.2.10.13. RANK

语法
TDSQL-MySQL不支持

5.2.10.14. STDDEV

语法
TDSQL-MySQL不支持

5.2.10.15. STDDEV_POP

语法
TDSQL-MySQL不支持

5.2.10.16. STDDEV_SAMP

语法
TDSQL-MySQL不支持

5.2.10.17. SUM

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

说明

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

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

警告

统一SQL暂时不支持SUM作为分析函数的用法,不支持over子句。

参数解释

参数

说明

DISTINCT ALL

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

expr

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

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|

-- 转换后TDSQL-MySQL:
SELECT sum(`salary`),sum(1),sum(DISTINCT `department_id`) FROM `unisql_employee` AS `ke`.
sum(`salary`)|sum(1)|sum(DISTINCT `department_id`)|
-------------+------+-----------------------------+
      130000|     6|                            6|

5.2.10.18. VAR_POP

语法
TDSQL-MySQL不支持

5.2.10.19. VAR_SAMP

语法
TDSQL-MySQL不支持

5.2.10.20. VARIANCE

语法
TDSQL-MySQL不支持

5.2.11. 分析函数

暂不支持,建议业务调整

5.2.12. 其他

5.2.12.1. 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|

-- 转换后TDSQL-MySQL:
SELECT * FROM `unisql_regexp_like_test` WHERE `name` REGEXP '^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|

5.2.13. 注意事项

  • 暂不支持分析函数。

  • 暂不支持over子句。

  • 关于参数中涉及到字面量 ''

oracle对字面量 '' 的处理等价于NULL
mysql对字面量 '' 的处理等价于0,在使用过程中,可能会出现两边结果不一致的情况
在单独使用字面量 '' 时请注意,举例说明:
-- 转换前Oracle SQL:
SELECT EXP(NULL),EXP(''),EXP(0) FROM DUAL;
---------+-------+------+
EXP(NULL)|EXP('')|EXP(0)|
---------+-------+------+
         |       |     1|

-- 转换后TDSQL-MySQL:
SELECT EXP(NULL),EXP(''),EXP(0) FROM DUAL;
---------+-------+------+
EXP(NULL)|EXP('')|EXP(0)|
---------+-------+------+
         |    1.0|   1.0|
  • 对于EXTRACT函数

Oracle在进行时间抽取时,如果参数带有时区,则根据其对应的UTC时间进行抽取,如果是其他类型的时间字段,则根据GMT时间进行抽取。
MySQL在进行时间抽取时,都是按照GMT对应时间进行抽取,即不考虑时区。
-- execute in oracle, you can see the difference between the result value of hour
SELECT CURRENT_TIMESTAMP,systimestamp,TO_TIMESTAMP_TZ('2023-09-07 16:15:40','YYYY-MM-DD HH24:MI:SS'),TIMESTAMP '2023-09-07 16:15:40' FROM dual
-----------------------------+-----------------------------+------------------------------------------------------------+-----------------------------+
CURRENT_TIMESTAMP            |SYSTIMESTAMP                 |TO_TIMESTAMP_TZ('2023-09-0716:15:40','YYYY-MM-DDHH24:MI:SS')|TIMESTAMP'2023-09-0716:15:40'|
-----------------------------+-----------------------------+------------------------------------------------------------+-----------------------------+
2023-09-07 16:51:27.192 +0800|2023-09-07 16:51:27.192 +0800|                               2023-09-07 16:15:40.000 +0800|      2023-09-07 16:15:40.000|

SELECT EXTRACT(HOUR FROM CURRENT_TIMESTAMP) AS HOUR1,EXTRACT(HOUR FROM systimestamp) AS HOUR2,EXTRACT(HOUR FROM TO_TIMESTAMP_TZ('2023-09-07 16:15:40','YYYY-MM-DD HH24:MI:SS')) AS HOUR3,EXTRACT(HOUR FROM TIMESTAMP '2023-09-07 16:15:40') AS HOUR FROM DUAL
-----+-----+-----+----+
HOUR1|HOUR2|HOUR3|HOUR|
-----+-----+-----+----+
    8|    8|    8|  16|
  • 关于ROWNUM

rownum作为where条件时,目前只支持 =1<=num 两种写法,参考rownum的示例。
  • 关于自定义函数

由于Oracle中一些函数在MySQL中没有与之对应的实现,统一SQL工具为尽可能的进行支持,提供了一些自定义函数,序列等的实现,在使用时需要先在MySQL数据库中运行统一SQL提供的脚本。
  • 常用日期格式模型列表

日期格式,说明

YYYY

4位数字表示的年份(例如:2021)。

YYY

3位数字表示的年份(例如:021)。

YY

2位数字表示的年份(例如:21)。

Y

年份的最后一位或两位数字(例如:1,21)。

RRRR

四位数字表示的年份,可以自动解释为近期年份(例如:2021)。

Q

一年中的季度(1-4)。

MM

表示月份的两位数字(01-12)。

MON

缩写形式的月份名称(例如:JAN,FEB)。

MONTH

完整形式的月份名称(例如:JANUARY,FEBRUARY)。

DD

表示月份中的日期的两位数字(01-31)。

DY

缩写形式的星期几名称(例如:MON,TUE)。

DAY

完整形式的星期几名称(例如:MONDAY,TUESDAY)。

HH

小时(00-23)。

HH12

12小时制的小时(01-12)。

HH24

24小时制的小时(00-23)。

MI

分钟(00-59)。

SS

秒(00-59)。

FF

小数秒(精度为百万分之一秒)。

AM

上午/下午标识符(例如:AM,PM)。