POSITION
描述
POSITION 函数用于查找子字符串在主字符串中的位置,位置从 1 开始计数。
语法
POSITION(<substr> IN <str>)
POSITION(<substr>, <str> [, <pos>])
参数
| 参数 | 说明 |
|---|---|
substr | 需要查找的子字符串。类型:VARCHAR |
str | 主字符串,在其中搜索子字符串。类型:VARCHAR |
pos | 可选参数,指定开始搜索的位置(从 1 开始)。如果指定,则从该位置开始搜索 |
返回值
返回 INT 类型,表示子字符串在主字符串中第一次出现的位置。
查找规则:
- 返回从 1 开始的位置索引
- 如果子字符串不存在,返回 0
- 如果指定了起始位置,从该位置开始查找
- 查找是大小写敏感的
特殊情况:
- 如果任一参数为 NULL,返回 NULL
- 如果子字符串为空字符串,返回 1(或起始位置)
- 如果起始位置超出字符串长度,返回 0
- 起始位置为负数时,从字符串开头开始查找
示例
- 基本查找(两种语法)
SELECT POSITION('bar' IN 'foobarbar'), POSITION('bar', 'foobarbar');
+----------------------------------+--------------------------------+
| POSITION('bar' IN 'foobarbar') | POSITION('bar', 'foobarbar') |
+----------------------------------+--------------------------------+
| 4 | 4 |
+----------------------------------+--------------------------------+
- 指定起始位置查找
SELECT POSITION('bar', 'foobarbar', 5), POSITION('xbar', 'foobar');
+-----------------------------------+----------------------------------+
| POSITION('bar', 'foobarbar', 5) | POSITION('xbar', 'foobar') |
+-----------------------------------+----------------------------------+
| 7 | 0 |
+-----------------------------------+----------------------------------+
- NULL 值处理
SELECT POSITION('test' IN NULL), POSITION(NULL, 'test');
+--------------------------+------------------------+
| POSITION('test' IN NULL) | POSITION(NULL, 'test') |
+--------------------------+------------------------+
| NULL | NULL |
+--------------------------+------------------------+
- 空字符串处理
SELECT POSITION('' IN 'hello'), POSITION('world' IN '');
+------------------------+------------------------+
| POSITION('' IN 'hello') | POSITION('world' IN '') |
+------------------------+------------------------+
| 1 | 0 |
+------------------------+------------------------+
- 大小写敏感查找
SELECT POSITION('World' IN 'Hello World'), POSITION('world' IN 'Hello World');
+----------------------------------+----------------------------------+
| POSITION('World' IN 'Hello World') | POSITION('world' IN 'Hello World') |
+----------------------------------+----------------------------------+
| 7 | 0 |
+----------------------------------+----------------------------------+
- 从不同位置开始查找
SELECT POSITION('a', 'banana', 1), POSITION('a', 'banana', 3);
+-----------------------------+-----------------------------+
| POSITION('a', 'banana', 1) | POSITION('a', 'banana', 3) |
+-----------------------------+-----------------------------+
| 2 | 4 |
+-----------------------------+-----------------------------+
- UTF-8 多字节字符
SELECT POSITION('ḍḍumai' IN 'ṭṛì ḍḍumai hello'), POSITION('hello', 'ṭṛì ḍḍumai hello', 8);
+--------------------------------------+-------------------------------------------+
| POSITION('ḍḍumai' IN 'ṭṛì ḍḍumai hello') | POSITION('hello', 'ṭṛì ḍḍumai hello', 8) |
+--------------------------------------+-------------------------------------------+
| 5 | 13 |
+--------------------------------------+-------------------------------------------+
- 特殊字符查找
SELECT POSITION('@' IN 'user@domain.com'), POSITION('.', 'user@domain.com', 10);
+----------------------------------+--------------------------------------+
| POSITION('@' IN 'user@domain.com') | POSITION('.', 'user@domain.com', 10) |
+----------------------------------+--------------------------------------+
| 5 | 12 |
+----------------------------------+--------------------------------------+
- 超出边界的起始位置
SELECT POSITION('test', 'hello world', 20), POSITION('test', 'hello world', 0);
+--------------------------------------+-------------------------------------+
| POSITION('test', 'hello world', 20) | POSITION('test', 'hello world', 0) |
+--------------------------------------+-------------------------------------+
| 0 | 0 |
+--------------------------------------+-------------------------------------+
- 数字和符号中的查找
SELECT POSITION('123' IN '456123789'), POSITION('-', 'phone: 123-456-7890', 11);
+------------------------------+-------------------------------------------+
| POSITION('123' IN '456123789') | POSITION('-', 'phone: 123-456-7890', 11) |
+------------------------------+-------------------------------------------+
| 4 | 11 |
+------------------------------+-------------------------------------------+