4.2.8. 操作符
本章主要介绍统一SQL对Oracle数据库的操作符转换到其他数据库中存在的一些差异点;具体支持操作符边界可参考 统一SQL使用边界规范
4.2.8.1. LightDB-Oracle
4.2.8.1.1. 串联运算符
串联运算符 || 用于连接字符串和 CLOB 数据类型的数据。使用串联运算符连接两个字符串后会得到另一个字符串。
-- 转换前Oracle SQL: select '成交价格高于前一日收盘价;成交价格:' || 2 * 1000.00 || '元,收盘价:' || null || '' || ' '|| 'end'|| '' FROM DUAL; '成交价格高于前一日收盘价;成交价格:'||2*1000.00||'元,收盘价:'||NULL||''||''||'END'||''| ------------------------------------------------------------------+ 成交价格高于前一日收盘价;成交价格:2000元,收盘价: end | -- 转换后LightDB-Oracle SQL: SELECT ((((((('成交价格高于前一日收盘价;成交价格:'||2*1000.00)||'元,收盘价:')||NULL)||'')||' ')||'end')||'') FROM DUAL; ?column? | ----------------------------------+ 成交价格高于前一日收盘价;成交价格:2000元,收盘价: end|
4.2.8.2. PostgreSQL
4.2.8.2.1. 串联运算符
串联运算符 || 用于连接字符串和 CLOB 数据类型的数据。使用串联运算符连接两个字符串后会得到另一个字符串。
-- 转换前Oracle SQL: select '成交价格高于前一日收盘价;成交价格:' || 2 * 1000.00 || '元,收盘价:' || null || '' || ' '|| 'end'|| '' FROM DUAL; '成交价格高于前一日收盘价;成交价格:'||2*1000.00||'元,收盘价:'||NULL||''||''||'END'||''| ------------------------------------------------------------------+ 成交价格高于前一日收盘价;成交价格:2000元,收盘价: end | -- 转换后PostgreSQL SQL: SELECT concat(concat(concat(concat(concat(concat(concat('成交价格高于前一日收盘价;成交价格:', 2*1000.00), '元,收盘价:'), NULL), ''), ' '), 'end'), ''); concat | -------------------------------------+ 成交价格高于前一日收盘价;成交价格:2000.00元,收盘价: end|
警告
本方案中串联运算符会转化成concat函数,转化的结果是字符串,字符串去和其他数据类型进行运算、比较时,因为源库和目标库的隐式转化不同,出现转出的SQL无法在目标库中执行的情况。
4.2.8.3. Tdsql-MySQL
4.2.8.3.1. 串联运算符
串联运算符 || 用于连接字符串和 CLOB 数据类型的数据。使用串联运算符连接两个字符串后会得到另一个字符串。
-- 转换前Oracle SQL: select '成交价格高于前一日收盘价;成交价格:' || 2 * 1000.00 || '元,收盘价:' || '' || ' '|| 'end'|| '' FROM DUAL; '成交价格高于前一日收盘价;成交价格:'||2*1000.00||'元,收盘价:'||''||''||'END'||''| ------------------------------------------------------------+ 成交价格高于前一日收盘价;成交价格:2000元,收盘价: end | -- 转换后TDSQL-MySQL: SELECT concat(concat(concat(concat(concat(concat(ifnull('成交价格高于前一日收盘价;成交价格:', ''), ifnull(2*1000.00, '')), ifnull('元,收盘价:', '')), ifnull('', '')), ifnull(' ', '')), ifnull('end', '')), ifnull('', '')) FROM DUAL; concat(concat(concat(concat(concat(concat(ifnull('成交价格高于前一日收盘价;成交价格:', ''), ifnull(2*1000.00, '')), ifnull('元,收盘价:', '')), ifnull('', '')), ifnull(' ', '')), ifnull('end', '')), ifnull('', ''))| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 成交价格高于前一日收盘价;成交价格:2000.00元,收盘价: end |
警告
本方案中串联运算符会转化成concat函数,转化的结果是字符串,字符串去和其他数据类型进行运算、比较时,因为源库和目标库的隐式转化不同,出现转出的SQL无法在目标库中执行的情况。
4.2.8.4. Tdsql-Oracle
4.2.8.4.1. 串联运算符
串联运算符 || 用于连接字符串和 CLOB 数据类型的数据。使用串联运算符连接两个字符串后会得到另一个字符串。
-- 转换前Oracle SQL: select '成交价格高于前一日收盘价;成交价格:' || 2 * 1000.00 || '元,收盘价:' || null || '' || ' '|| 'end'|| '' FROM DUAL; '成交价格高于前一日收盘价;成交价格:'||2*1000.00||'元,收盘价:'||NULL||''||''||'END'||''| ------------------------------------------------------------------+ 成交价格高于前一日收盘价;成交价格:2000元,收盘价: end | -- 转换后TDSQL-Oracle模式 SQL: SELECT concat(concat(concat(concat(concat(concat(concat('成交价格高于前一日收盘价;成交价格:', 2*1000.00), '元,收盘价:'), NULL), ''), ' '), 'end'), ''); concat | -------------------------------------+ 成交价格高于前一日收盘价;成交价格:2000.00元,收盘价: end|
警告
本方案中串联运算符会转化成concat函数,转化的结果是字符串,字符串去和其他数据类型进行运算、比较时,因为源库和目标库的隐式转化不同,出现转出的SQL无法在目标库中执行的情况。
4.2.8.5. OceanBase-Mysql
4.2.8.5.1. 串联运算符
串联运算符 || 用于连接字符串和 CLOB 数据类型的数据。使用串联运算符连接两个字符串后会得到另一个字符串。
-- 转换前Oracle SQL: select '成交价格高于前一日收盘价;成交价格:' || 2 * 1000.00 || '元,收盘价:' || '' || ' '|| 'end'|| '' FROM DUAL; '成交价格高于前一日收盘价;成交价格:'||2*1000.00||'元,收盘价:'||''||''||'END'||''| ------------------------------------------------------------+ 成交价格高于前一日收盘价;成交价格:2000元,收盘价: end | -- 转换后OceanBase-MySQL: SELECT concat(concat(concat(concat(concat(concat(ifnull('成交价格高于前一日收盘价;成交价格:', ''), ifnull(2*1000.00, '')), ifnull('元,收盘价:', '')), ifnull('', '')), ifnull(' ', '')), ifnull('end', '')), ifnull('', '')) FROM DUAL; concat(concat(concat(concat(concat(concat(ifnull('成交价格高于前一日收盘价;成交价格:', ''), ifnull(2*1000.00, '')), ifnull('元,收盘价:', '')), ifnull('', '')), ifnull(' ', '')), ifnull('end', '')), ifnull('', ''))| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 成交价格高于前一日收盘价;成交价格:2000.00元,收盘价: end |
警告
本方案中串联运算符会转化成concat函数,转化的结果是字符串,字符串去和其他数据类型进行运算、比较时,因为源库和目标库的隐式转化不同,出现转出的SQL无法在目标库中执行的情况。
4.2.8.6. OceanBase-Oracle
4.2.8.6.1. 串联运算符
串联运算符 || 用于连接字符串和 CLOB 数据类型的数据。使用串联运算符连接两个字符串后会得到另一个字符串。
-- 转换前Oracle SQL: select '成交价格高于前一日收盘价;成交价格:' || 2 * 1000.00 || '元,收盘价:' || null || '' || ' '|| 'end'|| '' FROM DUAL; '成交价格高于前一日收盘价;成交价格:'||2*1000.00||'元,收盘价:'||NULL||''||''||'END'||''| ------------------------------------------------------------------+ 成交价格高于前一日收盘价;成交价格:2000元,收盘价: end | -- 转换后OceanBase-Oracle SQL: SELECT '成交价格高于前一日收盘价;成交价格:'||2*1000.00||'元,收盘价:'||NULL||''||' '||'end'||'' FROM DUAL; '成交价格高于前一日收盘价;成交价格:'||2*1000.00||'元,收盘价:'||NULL||''||''||'END'||''| ------------------------------------------------------------------+ 成交价格高于前一日收盘价;成交价格:2000元,收盘价: end |
4.2.8.7. GaussDB-Oracle
4.2.8.7.1. 串联运算符
串联运算符 || 用于连接字符串和 CLOB 数据类型的数据。使用串联运算符连接两个字符串后会得到另一个字符串。
-- 转换前Oracle SQL: select '成交价格高于前一日收盘价;成交价格:' || 2 * 1000.00 || '元,收盘价:' || null || '' || ' '|| 'end'|| '' FROM DUAL; '成交价格高于前一日收盘价;成交价格:'||2*1000.00||'元,收盘价:'||NULL||''||''||'END'||''| ------------------------------------------------------------------+ 成交价格高于前一日收盘价;成交价格:2000元,收盘价: end | -- 转换后达梦 SQL: SELECT '成交价格高于前一日收盘价;成交价格:'||2*1000.00||'元,收盘价:'||NULL||''||' '||'end'||'' FROM DUAL; ?column? | ----------------------------------+ 成交价格高于前一日收盘价;成交价格:2000元,收盘价: end|
警告
目标库、源库串联运算符优先级不同,源库中串联运算符和加法、减法在同一级,而目标库中串联运算符和加法、减法不在同一级。所以串联的字符串中含有加法或减法,两边数据库结果可能不一致。