3.3.2.4. 转换为 OceanBase-Oracle

3.3.2.4.1. 时间日期函数

3.3.2.4.1.1. DAY

语法
DAY(date)
描述
用于从日期或日期时间值中提取”日”部分的函数。

参数解释

参数

说明

date

一个有效的日期或日期时间表达式,目前只支持date类型的参数

返回类型

整型

警告

  • 统一SQL转换后在目标端数据库执行结果与mysql和mariadb存在一些差异,差异点如下:

    1. 如果入参为非法时间格式如: 2024-01-3210000-01-320000-00-00,mysql和mariadb会返回NULL或者0,而OceanBase-Oracle转换后会执行报错。

    2. 尽量保证入参日期范围和格式标准,对于非标准的日期格式,例如: 024-01-322024-01-1 统一SQL可能会成功转换,但不保证目标端执行结果准确。

    3. 如果入参为合法的时间格式的字符串类型时,mysql和mariadb会返回正确结果,转换后OceanBase-Oracle会执行报错。

示例

-- 转换前MySQL SQL:
select day(STR_TO_DATE('2024-01-31 01:00:00', '%Y-%m-%d %H:%i:%s'));
+-------------------------------+
| day                           |
+-------------------------------+
|                             31|
+-------------------------------+


-- 转换后OceanBase-Oracle  SQL:
SELECT extract(DAY FROM to_date('2024-01-31 01:00:00', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;
DAY                       |
--------------------------+
                        31|

3.3.2.4.1.2. YEAR

语法
YEAR(date)
描述
用于从日期或日期时间值中提取年份部分的函数。

参数解释

参数

说明

date

一个有效的日期或日期时间表达式,目前只支持date类型的参数

返回类型

整型

警告

  • 统一SQL转换后在目标端数据库执行结果与mysql和mariadb存在一些差异,差异点如下:

    1. 如果入参为非法时间格式如: 2024-01-3210000-01-320000-00-00,mysql和mariadb会返回NULL或者0,而OceanBase-Oracle转换后会执行报错。

    2. 尽量保证入参日期范围和格式标准,对于非标准的日期格式,例如: 024-01-322024-01-1 统一SQL可能会成功转换,但不保证目标端执行结果准确。

    3. 如果入参为合法的时间格式的字符串类型时,mysql和mariadb会返回正确结果,转换后OceanBase-Oracle会执行报错。

示例

-- 转换前MySQL SQL:
select year(STR_TO_DATE('2024-01-31 01:00:00', '%Y-%m-%d %H:%i:%s')) as year;
+-------------------------------+
| year                          |
+-------------------------------+
|                         2024  |
+-------------------------------+


-- 转换后OceanBase-Oracle  SQL:
SELECT extract(DAY FROM to_date('2024-01-31 01:00:00', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;
YEAR                      |
--------------------------+
                      2024|

3.3.2.4.1.3. DAYOFWEEK

语法
dayofweek(date)
描述
用于获取日期对应的星期几的函数

参数解释

参数

说明

date

一个有效的日期或日期时间表达式,目前只支持date类型的参数

返回类型

整型:[1-7] 对应为 [星期日-星期六]

警告

  • 统一SQL转换后在目标端数据库执行结果与mysql和mariadb存在一些差异,差异点如下:

    1. 如果入参为非法时间格式如: 2024-01-3210000-01-320000-00-00,mysql和mariadb会返回NULL或者0,而OceanBase-Oracle转换后会执行报错。

    2. 尽量保证入参日期范围和格式标准,对于非标准的日期格式,例如: 024-1-322024-01-1 统一SQL可能会成功转换,但不保证目标端执行结果准确。

    3. 如果入参为合法的时间格式的字符串类型时,mysql和mariadb会返回正确结果,转换后OceanBase-Oracle会执行报错。

示例

-- 转换前MySQL SQL:
select dayofweek(STR_TO_DATE('2025-04-05', '%Y-%m-%d')) as dayofweekalias;
+-------------------------------+
| dayofweekalias                |
+-------------------------------+
|                         7     |
+-------------------------------+


-- 转换后OceanBase-Oracle  SQL:
SELECT to_number(to_char(to_date('2025-04-05', 'YYYY-MM-DD'), 'D')) AS dayofweekalias FROM DUAL;
DAYOFWEEKALIAS            |
--------------------------+
                      7   |

3.3.2.4.1.4. STR_TO_DATE

语法
STR_TO_DATE(str,format)
描述
将字符串转换为日期的函数

参数解释

参数

说明

str

日期字符串,只支持源库类型VARCHAR

format

格式化字符串,只支持常量字符串

返回类型

在源库中,当format中包含日期和时间部分时返回datetime类型,当format中只包含日期部分时返回date类型,当format中只包含时间部分时返回time类型。
转换后在目标库中,统一都返回TIMESTAMP类型

格式串转换说明

原格式

目标格式

说明

%c

MM

月份,数值

%d

DD

日,数值(00-31)

%e

DD

日,数值(0-31)

%f

FF6

微秒

%H

HH24

小时 (00-23)

%h

HH12

小时 (01-12)

%I

HH12

小时 (01-12)

%i

MI

分钟,数值(00-59)

%k

HH24

小时 (0-23)

%l

HH12

小时 (1-12)

%M

Month

月份名

%m

MM

月,数值(00-12)

%S

SS

秒(00-59)

%s

SS

秒(00-59)

%T

HH24:MI:SS

时间, 24-小时 (hh:mm:ss)

%Y

YYYY

年,4 位

%y

YY

年,2 位

警告

    1. 因为在目标库中空串’’等价NULL值,所以当函数入参为空串时,会返回NULL。这点与MySQL和MariaDB不同。

    1. 转换时支持的格式串见格式串转换说明,不支持的格式串会被直接透传到目标库(如%p %r %W)。在转换上语义上是等价的,但是由于返回值类型存在差异,所以在目标库执行结果可能会存在展示差异以实际为准。

    1. 当format仅包含时间类型时,MYSQL返回的是TIME类型只包含时间部分,但是在目标库中返回的是TIMESTAMP类型,包含日期部分。参见 数据类型转换映射表

    1. 当str中的月份不满4位时,如24,MYSQL中会前补20,OCEANBASE-ORACLE中是前补00,导致转换后结果不一致,建议用户使用时写4位的年份。

示例

-- 转换前MySQL SQL:
SELECT STR_TO_DATE('2025/01/06 14:30:29', '%Y/%m/%d %H:%i:%s');
2025-01-06 14:30:29

-- 转换后OceanBase-Oracle  SQL:
SELECT to_timestamp('2025/01/06 14:30:29', 'YYYY/MM/DD HH24:MI:SS') FROM DUAL;
2025-01-06 14:30:29.000

3.3.2.4.2. 字符串函数

3.3.2.4.2.1. LOCATE

语法
LOCATE (substr, str [, position])
描述
返回子字符串第一次出现的位置。 若任一入参是NULL或’’,则返回NULL。

参数解释

参数

说明

substr

需要查找的字串,该参数为字符串类型

str

需要被查找的父串,该参数为字符串类型

position

正整数,从父串中指定位置开始查找子串(初始值为1),该参数为整形类型,可选参数,不填时默认从父串启示位置开始查找子串

警告

  • 由于OceanBase-Oracle中无法区分空串与NULL,所以在OceanBase-Oracle 中只能将’’与NULL,都返回NULL。

  • Mysql根据排序规则可以设置区分大小写,而OceanBase-Oracle不行,所以转换后的函数大小写敏感。

  • position 仅支持正整数或正整数字符串。若为浮点数数值将存在差异,mysql为四舍五入,OceanBase-Oracle向下取整。

示例

-- 转换前MySQL SQL:
SELECT LOCATE('bar', 'foobarbar', 5) FROM dual;
+-------------------------------+
| LOCATE('bar', 'foobarbar', 5) |
+-------------------------------+
|                             7 |
+-------------------------------+

SELECT LOCATE('bar', 'foobarbar', 1) FROM dual;
+-------------------------------+
| LOCATE('Bar', 'foobarbar', 1) |
+-------------------------------+
|                             4 |
+-------------------------------+


SELECT LOCATE('Bar', 'foobarbar', 1) FROM dual;
+-------------------------------+
| LOCATE('Bar', 'foobarbar', 1) |
+-------------------------------+
|                             4 |
+-------------------------------+


SELECT LOCATE('', 'foobarbar', 1) FROM dual;
+----------------------------+
| LOCATE('', 'foobarbar', 1) |
+----------------------------+
|                          1 |
+----------------------------+


SELECT LOCATE(NULL, 'foobarbar', 1) FROM dual;
+------------------------------+
| LOCATE(NULL, 'foobarbar', 1) |
+------------------------------+
|                         NULL |
+------------------------------+


-- 转换后OceanBase-Oracle  SQL:
SELECT instr('foobarbar', 'bar', 5) FROM dual;
INSTR('FOOBARBAR','BAR',5)|
--------------------------+
                         7|


SELECT instr('foobarbar', 'bar', 1) FROM dual;
INSTR('FOOBARBAR','BAR',1)|
--------------------------+
                         4|


SELECT instr('foobarbar', 'Bar', 1) FROM dual;
INSTR('FOOBARBAR','BAR',1)|
--------------------------+
                         0|


SELECT instr('foobarbar', NULL, 1) FROM dual;
INSTR('FOOBARBAR',NULL,1)|
-------------------------+
                         |


SELECT instr('foobarbar', '', 1) FROM dual;
INSTR('FOOBARBAR','',1)|
-----------------------+
                       |

3.3.2.4.2.2. CONCAT

语法
CONCAT (str1, str2, ...)
描述
将入参字符串拼接在一起。

参数解释

参数

说明

str

需要拼接的字符串,该参数为字符串数据类型

警告

  • 由于oceanbase-oracle中无法区分空串与NULL,所以在oceanbase-oracle中,只能将’’与NULL一视同仁来处理。

  • MySQL的函数参数如果有NULL则会返回NULL,而oceanbase-oracle不会。

示例

-- 转换前MySQL SQL:
select concat('123', 'abcAA', 'nihao') from dual;
+---------------------------------+
| concat('123', 'abcAA', 'nihao') |
+---------------------------------+
| 123abcAAnihao                   |
+---------------------------------+


select concat('123', '', 'nihao') from dual;
+----------------------------+
| concat('123', '', 'nihao') |
+----------------------------+
| 123nihao                   |
+----------------------------+



select concat('123', NULL, 'nihao') from dual;
+------------------------------+
| concat('123', NULL, 'nihao') |
+------------------------------+
| NULL                         |
+------------------------------+



select concat('123abc') from dual;
+------------------+
| concat('123abc') |
+------------------+
| 123abc           |
+------------------+


-- 转换后oceanbase-oracle SQL:
SELECT concat(concat('123', 'abcAA'), 'nihao') FROM dual;
CONCAT(CONCAT('123','ABCAA'),'NIHAO')|
-------------------------------------+
123abcAAnihao                        |


SELECT concat(concat('123', ''), 'nihao') FROM dual;
CONCAT(CONCAT('123',''),'NIHAO')|
--------------------------------+
123nihao                        |


SELECT concat(concat('123', NULL), 'nihao') FROM dual;
CONCAT(CONCAT('123',NULL),'NIHAO')|
----------------------------------+
123nihao                          |


SELECT concat('123abc', '') FROM dual;
CONCAT('123ABC','')|
-------------------+
123abc             |

3.3.2.4.2.3. GROUP_CONCAT

语法
GROUP_CONCAT ([DISTINCT] column_name… [ORDER BY ASC/DESC column_name] [Separator sep_str])
描述
将来自多个行的列值组合成一个单独的字符串,每个值之间可以用分隔符隔开。 column_name 仅支持为一个。

参数解释

参数

说明

column_name

需要拼接的字符串列,该参数为字符串数据类型

sep_str

分割标识符,默认为逗号(,)分割

警告

  • GROUP_CONCAT函数与listagg函数拼接顺序不完全一致。行展示顺序不一致,建议使用该函数时根据列名进行排序。

  • 存在表达式计算时精度、标度和oceanbase-oracle不完全一致。

  • 暂时不支持和keep、over联合使用和聚合函数使用时不支持嵌套使用

  • GROUP BY分组顺序存在不一致的情况。

  • 和聚合函数使用时不支持嵌套使用。

示例

 CREATE TABLE sales (
 id int,
 product VARCHAR(50),
 quantity INT,
 sale_date varchar(50)
 );

 INSERT INTO sales VALUES (4, 'Apple', 10, '2023-01-15');
 INSERT INTO sales VALUES (4, 'Banana', 5, '2023-01-20');
 INSERT INTO sales VALUES (1, 'Orange', 8, '2023-02-01');
 INSERT INTO sales VALUES (1, 'Grape', 12, '2023-01-10');
 INSERT INTO sales VALUES (3, 'Apple', 3, '2023-03-01');


 -- 转换前MySQL SQL:
 SELECT id, GROUP_CONCAT( product  ORDER BY id SEPARATOR ',') AS products FROM sales GROUP BY id;
 id|products    |
 --+------------+
  1|Grape,Orange|
  3|Apple       |
  4|Banana,Apple|

 SELECT id, GROUP_CONCAT( product  SEPARATOR ',') AS products FROM sales GROUP BY id;
 id|products    |
 --+------------+
  1|Orange,Grape|
  3|Apple       |
  4|Apple,Banana|

 SELECT id, GROUP_CONCAT(DISTINCT product  SEPARATOR ',') AS products FROM sales GROUP BY id;
id|products    |
--+------------+
 1|Grape,Orange|
 3|Apple       |
 4|Apple,Banana|


 -- 转换后oceanbase-oracle SQL:
 SELECT id,listagg(product, ',') WITHIN GROUP (ORDER BY id) AS products FROM sales GROUP BY id;
 ID|PRODUCTS    |
 --+------------+
  1|Grape,Orange|
  3|Apple       |
  4|Apple,Banana|


 SELECT id,listagg(product, ',') AS products FROM sales GROUP BY id;
 ID|PRODUCTS    |
 --+------------+
 1|Orange,Grape|
 4|Apple,Banana|
 3|Apple       |


  SELECT id,listagg(DISTINCT product, ',') AS products FROM sales GROUP BY id;
  ID|PRODUCTS    |
 --+------------+
  1|Grape,Orange|
  3|Apple       |
  4|Apple,Banana|

3.3.2.4.3. 其他函数

3.3.2.4.3.1. LAST_INSERT_ID

语法
LAST_INSERT_ID()
描述
返回最近一次 INSERT 语句产生的自增 ID (AUTO_INCREMENT)。

参数解释

该函数没有参数。

警告

  • 使用 last_insert_id 前必须使用 INSERT 语句且 INSERT 语句对应的表必须有 AUTO_INCREMENT 字段, 其他场景该函数的输出是未定义行为。

  • 使用 INSERT 语句插入多条数据时,返回的是最后一条自增的 ID。

  • 不支持多会话/多线程。

示例

CREATE TABLE test_auto_inc (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50));

-- 转换前MySQL SQL / 转换后oceanbase-oracle SQL:
INSERT INTO test_auto_inc (name) VALUES ('apple');
SELECT LAST_INSERT_ID();

+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1                |
+------------------+

3.3.2.4.3.2. COMPRESS

语法
compress (plaintext)
描述
压缩字符串并返回二进制数据。

参数解释

参数

说明

plaintext

需要压缩的明文,该参数为字符串类型

警告

  • 未实现压缩行为,仅将内容转成二进制类型。

  • 参数不能超过2000个字符

  • 只支持varchar类型

  • 参数为空串时返回NULL,mysql返回空串

示例

-- 转换前MySQL SQL:
select compress('123abc你好');
+----------------------------------------------------+
| compress('123abc你好')                             |
+----------------------------------------------------+
| 0x0C000000789C3334324E4C4A7EB277C1D3A57B011FE90645 |
+----------------------------------------------------+

-- 转换后oceanbase-oracle SQL:
SELECT UTL_RAW.CAST_TO_RAW('123abc你好') from dual;
+-------------------------------------+
| UTL_RAW.CAST_TO_RAW('123ABC你好')   |
+-------------------------------------+
| 313233616263E4BDA0E5A5BD            |
+-------------------------------------+

3.3.2.4.3.3. UNCOMPRESS

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

警告

  • 未实现解压行为,仅将参数转为blob类型。

  • 只支持BLOB和RAW类型参数

  • 参数为空串时返回NULL,mysql返回空串

参数解释

参数

说明

ciphertext

需要解压缩的密文,该参数为二进制类型RAW。

示例

-- 转换前MySQL SQL:
select uncompress(compress('123abc你好'));
+------------------------------------+
| uncompress(compress('123abc你好')) |
+------------------------------------+
| 0x313233616263E4BDA0E5A5BD         |
+------------------------------------+

-- 转换后oceanbase-oracle SQL:
SELECT to_blob(UTL_RAW.CAST_TO_RAW('123abc你好')) from dual;
+------------------------------------------------------------------------------------------+
| TO_BLOB(UTL_RAW.CAST_TO_RAW('123ABC你好'))                                               |
+------------------------------------------------------------------------------------------+
| 313233616263E4BDA0E5A5BD                                                                 |
+------------------------------------------------------------------------------------------+

3.3.2.4.4. 条件函数

3.3.2.4.4.1. IF

语法
IF (expr1, expr2, expr3)
描述
如果第一个参数为TRUE,则返回第二个参数,否则返回第三个参数。

参数解释

参数

说明

expr1

判断该参数是否为true

expr2

如果expr1为true,则返回expr2

expr3

如果expr1不为true,则返回expr3

警告

  • MySQL 中,null和空字符串不相等,而 oceanbase-oracle 中,null和空字符串相等都是 null

  • oceanbase-oracle 中null相关表达式操作会返回 null

  • expr1中null相关表达式操作会返回 null

  • oceanbase-oracle 类型转换规则方面与 MySQL 不同,expr2 与 expr3 必须是相同的类型,否则会报错 ORA-00932: 数据类型不一致 ; 如 select if (1 > 2, 1, '假') 是不支持的。

  • 当参数expr1非条件表达式时(当前条件表达式只支持 > < = <= >= != AND OR [IS NULL] [IS NOT NULL] NOT ),会调用函数is_nonzero判断是否为真。 is_nonzero 的入参是 VARCHAR2 ,因此如果参数expr1隐式转换为字符串时,mysql和oceanbase-oracle存在差异,如日期类型转字符串,会受到日期格式的影响。 参数expr1如果是数值开头的字符串会进行截取数值在和0比较,非0则返回 TRUE 。 参数expr1如果是非数值类型开头的字符串则返回 FALSE

示例

-- 转换前MySQL SQL:
SELECT IF(1 > 2, 2, 3);
+-----------------+
| IF(1 > 2, 2, 3) |
+-----------------+
|               3 |
+-----------------+

SELECT IF(1, 2, 3);
+-------------+
| IF(1, 2, 3) |
+-------------+
|           2 |
+-------------+

SELECT IF('123', 2, 3);
+-----------------+
| IF('123', 2, 3) |
+-----------------+
|               2 |
+-----------------+

select IF('1abc123',2,3);
+-------------------+
| IF('1abc123',2,3) |
+-------------------+
|                 2 |
+-------------------+

select IF('0.1abc123',2,3);
+---------------------+
| IF('0.1abc123',2,3) |
+---------------------+
|                   2 |
+---------------------+

select IF('abc123',2,3);
+------------------+
| IF('abc123',2,3) |
+------------------+
|                3 |
+------------------+



-- 转换后 oceanbase-oracle SQL:
SELECT case when 1>2 then 2 else 3 end from dual;
+--------------------------+
| CASEWHEN1>2THEN2ELSE3END |
+--------------------------+
|                        3 |
+--------------------------+

SELECT case when unisql.is_nonzero(1) != 0 then 2 else 3 end from dual;
+----------------------------------------------+
| CASEWHENUNISQL.IS_NONZERO(1)!=0THEN2ELSE3END |
+----------------------------------------------+
|                                            2 |
+----------------------------------------------+

SELECT case when unisql.is_nonzero('123') != 0 then 2 else 3 end from dual;
+--------------------------------------------------+
| CASEWHENUNISQL.IS_NONZERO('123')!=0THEN2ELSE3END |
+--------------------------------------------------+
|                                                2 |
+--------------------------------------------------+

SELECT case when unisql.is_nonzero('1abc123') != 0 then 2 else 3 end from dual;
+------------------------------------------------------+
| CASEWHENUNISQL.IS_NONZERO('1ABC123')!=0THEN2ELSE3END |
+------------------------------------------------------+
|                                                    2 |
+------------------------------------------------------+

SELECT case when unisql.is_nonzero('0.1abc123') != 0 then 2 else 3 end from dual;
+--------------------------------------------------------+
| CASEWHENUNISQL.IS_NONZERO('0.1ABC123')!=0THEN2ELSE3END |
+--------------------------------------------------------+
|                                                      2 |
+--------------------------------------------------------+

SELECT case when unisql.is_nonzero('abc123') != 0 then 2 else 3 end from dual;
+-----------------------------------------------------+
| CASEWHENUNISQL.IS_NONZERO('ABC123')!=0THEN2ELSE3END |
+-----------------------------------------------------+
|                                                   3 |
+-----------------------------------------------------+

3.3.2.4.4.2. IFNULL

语法
IFNULL (anycompatible1, anycompatible2)
描述
根据参数是否为空,返回相应的值。

参数解释

参数

说明

anycompatible1

判断该参数是否为null,如果不为null,则返回该参数

anycompatible2

判断第一个参数是否为null,如果为null,则返回该参数

警告

  • 由于oceanbase-oracle中无法区分空串与NULL,所以在oceanbase-oracle中,只能将’’与null一视同仁来处理。

  • anycompatible1和anycompatible2必须是相同的类型,或者可以隐式转换为相同的类型。

  • 因数据库某些特性存差异,导致执行结果不一致。如除0操作,mysql的1/0的返回值为 null,oceanbase-oracle不支持,报错 ORA-01476: divisor is equal to zero

  • anycompatible1不支持条件表达式, nvl(1>2,2)``oceanbase-oracle报错: ``ORA-00900:SQL 语句存在语法错误

示例

-- 转换前MySQL SQL:
SELECT ifnull(1, 15);
+---------------+
| ifnull(1, 15) |
+---------------+
|             1 |
+---------------+


select ifnull(null, 15);
+------------------+
| ifnull(null, 15) |
+------------------+
|               15 |
+------------------+


select ifnull('', 15);
+----------------+
| ifnull('', 15) |
+----------------+
|                |
+----------------+




-- 转换后oceanbase-oracle SQL:
SELECT nvl(1, 15) FROM dual;
+-----------+
| NVL(1,15) |
+-----------+
|         1 |
+-----------+

SELECT nvl(NULL, 15) FROM dual;
+--------------+
| NVL(NULL,15) |
+--------------+
|           15 |
+--------------+

SELECT nvl('', 15) FROM dual;
+------------+
| NVL('',15) |
+------------+
| 15         |
+------------+

3.3.2.4.4.3. ISNULL

语法
ISNULL (anycompatible)
描述
判断是否为null,为null则返回1,非null返回0。

参数解释

参数

说明

anycompatible

判断该参数是否为null

警告

  • 由于oceanbase-oracle中无法区分空串与NULL,所以在oceanbase-oracle中,只能将’’与NULL一视同仁来处理。

  • 因数据库某些特性存差异,导致执行结果不一致。如除0操作,mysql的1/0的返回值为 null,oceanbase-oracle不支持,报错 ORA-01476: divisor is equal to zero

  • 在 oceanbase-oracle 中,自定义函数不支持将 ISNULL 作为参数传入,否则会引发错误: ORA-00600: internal error code, arguments: -5555, Incorrect number of arguments。 例如,对于一个将两个数值相加的自定义函数 sum,若使用 sum(ISNULL(1), 2) 将会导致执行错误。为解决此问题,可以将 ISNULL(1) 的返回值显式转换为合适的类型,例如 sum(cast(ISNULL(1) as number), 2)

示例

-- 转换前MySQL SQL:
select ISNULL(1);
+-----------+
| ISNULL(1) |
+-----------+
|         0 |
+-----------+

select ISNULL(NULL);
+--------------+
| ISNULL(NULL) |
+--------------+
|            1 |
+--------------+

select ISNULL('');
+------------+
| ISNULL('') |
+------------+
|          0 |
+------------+


-- 转换后oceanbase-oracle SQL:
select ISNULL(1) from dual;
+-----------+
| ISNULL(1) |
+-----------+
|         0 |
+-----------+

select ISNULL(NULL) from dual;
+--------------+
| ISNULL(NULL) |
+--------------+
|            1 |
+--------------+

select ISNULL('') from dual;
+------------+
| ISNULL('') |
+------------+
|          1 |
+------------+