§ Oracle兼容-函数-INSTR()函数


§ 1. 语法

INSTR( string1, string2 [, start_position [, nth_appearance ] ] )
1

§ 2. 定义和用法

INSTR() 函数的作用是返回要截取的字符串在源字符串中的位置。即在 string1 中查找 string2,是从 start_position 给出的偏移量开始在 string1 里查找,查找出第 nth_appearance 次出现 string2 的位置。

§ 3. Oracle兼容说明

在GreatSQL中 INSTR() 函数的使用方法和Oracle相同。

在GreatSQL中已有 INSTR() 函数,其原生用法为:

INSTR(str,substr)
1

在GreatSQL中,扩展为下面的用法:

INSTR( string1, string2 [, start_position [, nth_appearance ] ] )
1

即:INSTR(源字符串, 目标字符串, 起始位置, 匹配序号)

注意:由于在GreatSQL中已有原生 INSTR() 函数,如果想使用扩展后的 INSTR() 函数,需要先执行 SET sql_mode = ORACLE 切换到 ORACLE 模式。

GreatSQL中 INSTR() 函数与Oracle不同之处有:当参数 nth_appearance 值为小数时,结果与Oracle不一致(Oracle会做特殊转换处理),详见下方示例。

§ 4. 示例

下面几个案例展示在GreatSQL和Oracle中可能存在不同的处理行为和返回结果:

-- 在GreatSQL和Oracle中均返回1
> SELECT INSTR('0.3333', '0.3') FROM DUAL;

-- 在GreatSQL和Oracle中均返回1
> SELECT INSTR(0.3333, 0.3) FROM DUAL;

-- 在GreatSQL返回1
-- 在Oracle中返回2
> SELECT INSTR('0.3333', 0.3) FROM DUAL;
1
2
3
4
5
6
7
8
9

下面是在GreatSQL中的测试案例:

-- 先切换到ORACLE模式
greatsql> SET sql_mode = ORACLE;

-- 返回:3,第一次出现“l”的位置
greatsql> SELECT INSTR('helloworld','l') FROM DUAL;
+-------------------------+
| INSTR('helloworld','l') |
+-------------------------+
|                       3 |
+-------------------------+

-- 返回:4,即“lo”同时出现,第一个字母“l”出现的位置
greatsql> SELECT INSTR('helloworld','lo') FROM DUAL;
+--------------------------+
| INSTR('helloworld','lo') |
+--------------------------+
|                        4 |
+--------------------------+

-- 返回:4,在"helloworld"的第2个字符(字符"e")偏移位置开始,查找第二次出现的“l”的位置
greatsql> SELECT INSTR('helloworld','l',2,2) FROM DUAL;
+-----------------------------+
| INSTR('helloworld','l',2,2) |
+-----------------------------+
|                           4 |
+-----------------------------+

-- 返回:9,在"helloworld"的偏移位置倒数第1(字符"d")开始,往回查找第一次出现的“l”的位置
greatsql> SELECT INSTR('helloworld','l',-1,1) FROM DUAL;
+------------------------------+
| INSTR('helloworld','l',-1,1) |
+------------------------------+
|                            9 |
+------------------------------+

-- 返回:22,即最后IP第四段数据
greatsql> SELECT SUBSTR('192.168.0.22', INSTR('192.168.0.22', '.', 1, 3) +1) FROM DUAL;
+-------------------------------------------------------------+
| SUBSTR('192.168.0.22', INSTR('192.168.0.22', '.', 1, 3) +1) |
+-------------------------------------------------------------+
| 22                                                          |
+-------------------------------------------------------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

下面这些案例可以自行测试,想想结果是否符合预期:

SET sql_mode = ORACLE;
SELECT INSTR('a','A') FROM DUAL;
SELECT INSTR('thisisatestsentence','t',1,'')  FROM DUAL;
SELECT INSTR('thisisatestsentence','t','',1)  FROM DUAL;
SELECT INSTR('thisisatestsentence','t',1,2.1)  FROM DUAL;
SELECT INSTR('thisisatestsentence','t',1,2.5)  FROM DUAL;
SELECT INSTR('thisisatestsentence','t',0.1,1)  FROM DUAL;
SELECT INSTR('thisisatestsentence','t',0.5,1)  FROM DUAL;
1
2
3
4
5
6
7
8

greatsql-wx