类别:

:doc:`/sql-reference/functions-string`(匹配/比较)

POSITION

搜索在第二个实参中首次出现的第一个实参,如果成功找到,则返回第一个实参在第二个实参中的位置(从 1 开始)。

如果需要查找第一次出现位置之后的位置(例如,第三次出现),可以使用 REGEXP_INSTR 函数。

别名:

CHARINDEX

请注意,CHARINDEX 函数不支持 POSITION 支持的任一语法变体。

语法

POSITION( <expr1>, <expr2> [ , <start_pos> ] )

POSITION( <expr1> IN <expr2> )
Copy

实参

必填:

expr1

表示要查找的值的字符串或二进制表达式。

expr2

表示要搜索的值的字符串或二进制表达式。

可选:

start_pos

表示从开始搜索的位置的数字(1 表示 expr2 的起始位置)。

默认:1

返回

此函数返回 NUMBER 类型的值。

如果任何实参为 NULL,则该函数返回 NULL。

使用说明

  • 如果未找到字符串或二进制值,则函数返回 0

  • 如果指定的可选 start_pos 超出第二个实参(要搜索的字符串)的末尾,则函数返回 0

  • 如果第一个实参为空(例如,空字符串),则该函数返回 1

  • 前两个实参的数据类型必须相同(要么是两个字符串,要么是两个二进制值)。

排序规则详细信息

此函数不支持以下排序规则规范:

  • :code:`pi`(不区分标点符号)。

  • :code:`cs-ai`(区分大小写,不区分重音)。

示例

以下示例使用 POSITION 函数。

VARCHAR 表达式

找出“banana”中第一次出现的“an”:

SELECT POSITION('an', 'banana', 1);
Copy
+-----------------------------+
| POSITION('AN', 'BANANA', 1) |
|-----------------------------|
|                           2 |
+-----------------------------+

在位置 3 或之后找出“banana”中第一次出现的“an”。此搜索将查找第二次出现的“an”。

SELECT POSITION('an', 'banana', 3);
Copy
+-----------------------------+
| POSITION('AN', 'BANANA', 3) |
|-----------------------------|
|                           4 |
+-----------------------------+

在字符串中搜索各种字符,包括 Unicode 字符:

SELECT n, h, POSITION(n IN h) FROM pos;
Copy
+--------+---------------------+------------------+
| N      | H                   | POSITION(N IN H) |
|--------+---------------------+------------------|
|        |                     |                1 |
|        | sth                 |                1 |
| 43     | 41424344            |                5 |
| a      | NULL                |             NULL |
| dog    | catalog             |                0 |
| log    | catalog             |                5 |
| lésine | le péché, la lésine |               14 |
| nicht  | Ich weiß nicht      |               10 |
| sth    |                     |                0 |
| ☃c     | ☃a☃b☃c☃d            |                5 |
| ☃☃     | bunch of ☃☃☃☃       |               10 |
| ❄c     | ❄a☃c❄c☃             |                5 |
| NULL   | a                   |             NULL |
| NULL   | NULL                |             NULL |
+--------+---------------------+------------------+

BINARY 表达式

由于以下值是十六进制表示形式,因此单个 BINARY 字节表示为两个十六进制数字。

在此示例中,返回值为 3,因为“EF”与第 3 个字节匹配(第一个字节为“AB”;第二个字节为“CD”,第三个字节为“EF”):

SELECT POSITION(X'EF', X'ABCDEF');
Copy
+----------------------------+
| POSITION(X'EF', X'ABCDEF') |
|----------------------------|
|                          3 |
+----------------------------+

在此示例中,没有匹配项。虽然序列“BC”似乎在正在搜索的值中,但“B”是第一个字节的第二个小数点,“C”是第二个字节的第一个小数点。实际上没有字节包含“BC”,因此返回值为 ``0``(未找到)。

SELECT POSITION(X'BC', X'ABCD');
Copy
+--------------------------+
| POSITION(X'BC', X'ABCD') |
|--------------------------|
|                        0 |
+--------------------------+
语言: 中文