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存在一些差异,差异点如下:
如果入参为非法时间格式如:
2024-01-32
,10000-01-32
,0000-00-00
,mysql和mariadb会返回NULL或者0,而OceanBase-Oracle转换后会执行报错。尽量保证入参日期范围和格式标准,对于非标准的日期格式,例如:
024-01-32
,2024-01-1
统一SQL可能会成功转换,但不保证目标端执行结果准确。如果入参为合法的时间格式的字符串类型时,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存在一些差异,差异点如下:
如果入参为非法时间格式如:
2024-01-32
,10000-01-32
,0000-00-00
,mysql和mariadb会返回NULL或者0,而OceanBase-Oracle转换后会执行报错。尽量保证入参日期范围和格式标准,对于非标准的日期格式,例如:
024-01-32
,2024-01-1
统一SQL可能会成功转换,但不保证目标端执行结果准确。如果入参为合法的时间格式的字符串类型时,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存在一些差异,差异点如下:
如果入参为非法时间格式如:
2024-01-32
,10000-01-32
,0000-00-00
,mysql和mariadb会返回NULL或者0,而OceanBase-Oracle转换后会执行报错。尽量保证入参日期范围和格式标准,对于非标准的日期格式,例如:
024-1-32
,2024-01-1
统一SQL可能会成功转换,但不保证目标端执行结果准确。如果入参为合法的时间格式的字符串类型时,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 位 |
警告
因为在目标库中空串’’等价NULL值,所以当函数入参为空串时,会返回NULL。这点与MySQL和MariaDB不同。
转换时支持的格式串见格式串转换说明,不支持的格式串会被直接透传到目标库(如%p %r %W)。在转换上语义上是等价的,但是由于返回值类型存在差异,所以在目标库执行结果可能会存在展示差异以实际为准。
当format仅包含时间类型时,MYSQL返回的是TIME类型只包含时间部分,但是在目标库中返回的是TIMESTAMP类型,包含日期部分。参见 数据类型转换映射表。
当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 |
+------------+