1.3.2.10.2. Goldendb-Mysql
1.3.2.10.2.1. 空串处理兼容Oracle
Goldendb-Mysql在处理空串''时,并不能与Oracle保持一致:
在Oracle中,空串''会被视为NULL,
但是在Goldendb-Mysql中,空串''不是NULL。
因此统一SQL作了如下支持:
当使用EXPR IS [NOT] NULL时,会改写为NULLIF(LENGTH(EXPR),0) IS [NOT] NULL。EXPR 表示任何表达式,包括列名,函数,二元表达式,绑定参数等。
警告
Oracle和Goldendb-Mysql在处理CHAR(N)存在差异,在Oracle中,CHAR(N)会将剩余的空间填充为空格,且视为有效空格(不等于NULL),在Goldendb-Mysql中则视为空串,因此也会被当做NULL处理掉。
当前不支持empty_clob/empty_blob,先不进行说明
- 由于某些函数本身对于空串和NULL的处理和Oracle不一致,函数结果不是''和NULL的区别,上述转换不能起效,示例如下:
-- oracle CONCAT 无结果 0行 SQL> select CONCAT(null,'aaa') from dual where CONCAT(null,'aaa') is null; no rows selected -- Goldendb-Mysql 转换后执行有1行 mysql> SELECT CONCAT(NULL, 'aaa') FROM dual WHERE nullif(length(CONCAT(NULL, 'aaa')), 0) IS NULL; +---------------------+ | CONCAT(NULL, 'aaa') | +---------------------+ | NULL | +---------------------+ 1 row in set (0.00 sec) -- 其他 select length('') from dual/select lengthb('') from dual -- 入参为null 一样 oracle: null golden_mysql: 0 select instr('', 'asa') from dual/select regexp_instr('', 'asa') from dual -- 入参为null 一样 oracle: null golden_mysql: 0 select COALESCE('', 'a') from dual; -- 入参为null 一样 oracle: 'a' golden_mysql: ''
示例
-- 转换前 Oracle SQL:
SELECT id, unique_col
FROM null_test_tab
WHERE CONCAT(varchar_col, varchar2_col) IS NULL
-- 转换后 SQL:
SELECT id,unique_col
FROM null_test_tab
WHERE nullif(length(CONCAT(varchar_col, varchar2_col)), 0) IS NULL
-- 转换前 Oracle SQL:
SELECT id, unique_col FROM null_test_tab WHERE varchar_col IS NULL
-- 转换后 SQL:
SELECT id,unique_col FROM null_test_tab WHERE nullif(length(varchar_col), 0) IS NULL