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