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|

警告

目标库、源库串联运算符优先级不同,源库中串联运算符和加法、减法在同一级,而目标库中串联运算符和加法、减法不在同一级。所以串联的字符串中含有加法或减法,两边数据库结果可能不一致。