4.2.2.6. 转换为 OceanBase-MySQL

4.2.2.6.1. 数值函数

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

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

4.2.2.6.1.2. DBMS_RANDOM.VALUE

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

参数解释

示例

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

-- 转换后oceanbase-mysql:
SELECT rand() FROM dual;
rand()            |
------------------+
0.2516990529854773|

4.2.2.6.1.3. DBMS_RANDOM.RANDOM

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

参数解释

示例

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

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

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

-- 转换后oceanbase-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|

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

-- 转换后oceanbase-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|

4.2.2.6.2. 字符串函数

4.2.2.6.2.1. LENGTH

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

参数解释

参数

说明

str

要操作的字符串

示例

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

-- 转换后oceanbase-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|

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

4.2.2.6.2.2. LENGTHB

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

参数解释

参数

说明

str

要操作的字符串

示例

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

-- 转换后oceanbase-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|

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

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

-- 转换后oceanbase-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                                                                             |                                                                          |                                                  |                                                    |

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

-- 转换后oceanbase-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+                                                                             |                                                                          |                                                  |                                                    |

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

-- 转换后oceanbase-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                                                  |                                    |

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

-- 转换后oceanbase-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|

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

-- 转换后oceanbase-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                                |

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

-- 转换后oceanbase-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                              |

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

-- 转换后oceanbase-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                                            |

-- 转换后oceanbase-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                                              |

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

4.2.2.6.3. 时间日期函数

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

-- 转换后oceanbase-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|

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

-- 转换后oceanbase-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|

4.2.2.6.3.3. SYSDATE

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

示例

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

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

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

-- 转换后oceanbase-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|

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

-- 转换后oceanbase-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|

4.2.2.6.3.6. CURRENT_DATE

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

参数解释

示例

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

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

4.2.2.6.3.7. CURRENT_TIMESTAMP

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

参数解释

示例

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

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

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


-- 转换后oceanbase-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|

4.2.2.6.4. 转换函数

4.2.2.6.4.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在目标库执行会存在报错或者精度错误的情况。

  • 在oceanbase-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|

-- 转换后oceanbase-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|

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

-- 转换后oceanbase-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|

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

-- 转换后oceanbase-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|

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

-- 转换后oceanbase-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              |                  |                |

4.2.2.6.5. 编码解码函数

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

-- 转换后oceanbase-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 |

4.2.2.6.6. 空值函数

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

-- 转换后oceanbase-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|

4.2.2.6.7. 环境和标识符函数

4.2.2.6.7.1. SYS_GUID

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

参数解释

示例

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

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

4.2.2.6.7.2. USER

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

示例

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

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

4.2.2.6.8. 聚合函数

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

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

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

-- 转换后oceanbase-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|

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

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

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

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

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

-- 转换后oceanbase-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|

4.2.2.6.8.6. 注意事项

  • 暂不支持分析函数。

  • 暂不支持over子句。

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

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

-- 转换后oceanbase-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)。