跳到主要内容

LOCATE

描述

LOCATE 函数返回子字符串 substr 在字符串 str 中第一次出现的位置(从 1 开始计数)。如果指定了可选的第三个参数 pos,则从字符串 str 的指定位置开始搜索。该函数是 MySQL 兼容函数,常用于字符串匹配和位置查找。

语法

LOCATE(<substr>, <str> [, <pos>])

参数

参数说明
<substr>需要查找的目标子字符串。类型:VARCHAR
<str>需要被搜索的源字符串。类型:VARCHAR
<pos>可选参数,搜索的起始位置(从 1 开始计数)。类型:INT

返回值

返回 INT 类型,表示 substr 在 str 中第一次出现的位置(从 1 开始计数)。

查找规则:

  • 位置从 1 开始计数(不是从 0)
  • 返回第一次匹配的位置
  • 如果指定了 pos,则从该位置开始搜索,但返回的位置仍然是相对于字符串开头的绝对位置
  • 搜索是大小写敏感的

特殊情况:

  • 如果没有找到匹配项,返回 0
  • 如果任意参数为 NULL,返回 NULL
  • 如果 substr 为空字符串,返回 1(或 pos 的值,如果指定了 pos 且 pos > 1)
  • 如果 str 为空字符串而 substr 不为空,返回 0
  • 如果 pos 小于 1,返回 0
  • 如果 pos 大于 str 的长度,返回 0

示例

  1. 基本查找
SELECT LOCATE('bar', 'foobarbar'), LOCATE('xbar', 'foobar'), LOCATE('bar', 'foobarbar', 5);
+----------------------------+--------------------------+-------------------------------+
| LOCATE('bar', 'foobarbar') | LOCATE('xbar', 'foobar') | LOCATE('bar', 'foobarbar', 5) |
+----------------------------+--------------------------+-------------------------------+
| 4 | 0 | 7 |
+----------------------------+--------------------------+-------------------------------+
  1. 查找第一个字符
SELECT LOCATE('f', 'foobar'), LOCATE('r', 'foobar');
+-----------------------+-----------------------+
| LOCATE('f', 'foobar') | LOCATE('r', 'foobar') |
+-----------------------+-----------------------+
| 1 | 6 |
+-----------------------+-----------------------+
  1. 未找到匹配项
SELECT LOCATE('xyz', 'foobar'), LOCATE('FOO', 'foobar');
+-------------------------+-------------------------+
| LOCATE('xyz', 'foobar') | LOCATE('FOO', 'foobar') |
+-------------------------+-------------------------+
| 0 | 0 |
+-------------------------+-------------------------+
  1. NULL 值处理
SELECT LOCATE(NULL, 'foobar'), LOCATE('foo', NULL), LOCATE(NULL, NULL);
+------------------------+----------------------+---------------------+
| LOCATE(NULL, 'foobar') | LOCATE('foo', NULL) | LOCATE(NULL, NULL) |
+------------------------+----------------------+---------------------+
| NULL | NULL | NULL |
+------------------------+----------------------+---------------------+
  1. 空字符串处理
SELECT LOCATE('', 'foobar'), LOCATE('foo', ''), LOCATE('', '');
+----------------------+-------------------+----------------+
| LOCATE('', 'foobar') | LOCATE('foo', '') | LOCATE('', '') |
+----------------------+-------------------+----------------+
| 1 | 0 | 1 |
+----------------------+-------------------+----------------+
  1. 指定起始位置
SELECT LOCATE('o', 'foobar', 1), LOCATE('o', 'foobar', 2), LOCATE('o', 'foobar', 4);
+--------------------------+--------------------------+--------------------------+
| LOCATE('o', 'foobar', 1) | LOCATE('o', 'foobar', 2) | LOCATE('o', 'foobar', 4) |
+--------------------------+--------------------------+--------------------------+
| 2 | 3 | 0 |
+--------------------------+--------------------------+--------------------------+
  1. 边界位置参数
SELECT LOCATE('foo', 'foobar', 0), LOCATE('foo', 'foobar', -1), LOCATE('foo', 'foobar', 10);
+----------------------------+-----------------------------+-----------------------------+
| LOCATE('foo', 'foobar', 0) | LOCATE('foo', 'foobar', -1) | LOCATE('foo', 'foobar', 10) |
+----------------------------+-----------------------------+-----------------------------+
| 0 | 0 | 0 |
+----------------------------+-----------------------------+-----------------------------+
  1. UTF-8 字符查找
SELECT LOCATE('ṛì', 'ṭṛì ḍḍumai'), LOCATE('ḍḍu', 'ṭṛì ḍḍumai');
+---------------------------+-----------------------------+
| LOCATE('ṛì', 'ṭṛì ḍḍumai') | LOCATE('ḍḍu', 'ṭṛì ḍḍumai') |
+---------------------------+-----------------------------+
| 2 | 5 |
+---------------------------+-----------------------------+
  1. 大小写敏感性
SELECT LOCATE('BAR', 'foobar'), LOCATE('Bar', 'foobar'), LOCATE('bar', 'fooBAR');
+-------------------------+-------------------------+-------------------------+
| LOCATE('BAR', 'foobar') | LOCATE('Bar', 'foobar') | LOCATE('bar', 'fooBAR') |
+-------------------------+-------------------------+-------------------------+
| 0 | 0 | 0 |
+-------------------------+-------------------------+-------------------------+
  1. 空字符串与位置参数
SELECT LOCATE('', 'foobar', 3), LOCATE('', 'foobar', 7), LOCATE('', '', 1);
+-------------------------+-------------------------+---------------------+
| LOCATE('', 'foobar', 3) | LOCATE('', 'foobar', 7) | LOCATE('', '', 1) |
+-------------------------+-------------------------+---------------------+
| 3 | 0 | 1 |
+-------------------------+-------------------------+---------------------+