3.3.2.4. 转换为 OceanBase-Oracle

3.3.2.4.1. 字符串函数

3.3.2.4.1.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.1.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.1.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|