FIND_IN_SET
描述
返回字符串 str 在以逗号分隔的字符串列表 strlist 中第一次出现的位置(从 1 开始计数)。该函数按照 MySQL 兼容模式实现,用于在逗号分隔的值列表中查找特定字符串。
语法
FIND_IN_SET(<str>, <strlist>)
参数
| 参数 | 说明 |
|---|---|
<str> | 需要查找的目标字符串。类型:VARCHAR |
<strlist> | 用逗号分隔的字符串列表,在其中查找 str。类型:VARCHAR |
返回值
返回 INT 类型,表示 str 在 strlist 中的位置(从 1 开始计数)。
查找规则:
- 完全匹配:只有当 str 完全匹配 strlist 中的某个子字符串时才返回位置
- 位置从 1 开始计数
- 返回第一次匹配的位置
特殊情况:
- 如果 str 为空字符串,返回 0
- 如果 strlist 为空字符串,返回 0
- 如果没有找到匹配项,返回 0
- 如果任一参数为 NULL,返回 NULL
- 如果 str 包含逗号,将无法正确匹配(因为逗号是分隔符)
- 匹配是大小写敏感的
示例
- 基本查找
SELECT FIND_IN_SET('b', 'a,b,c');
+---------------------------+
| FIND_IN_SET('b', 'a,b,c') |
+---------------------------+
| 2 |
+---------------------------+
- 查找第一个元素
SELECT FIND_IN_SET('apple', 'apple,banana,cherry');
+------------------------------------------+
| FIND_IN_SET('apple', 'apple,banana,cherry') |
+------------------------------------------+
| 1 |
+------------------------------------------+
- 查找最后一个元素
SELECT FIND_IN_SET('cherry', 'apple,banana,cherry');
+-------------------------------------------+
| FIND_IN_SET('cherry', 'apple,banana,cherry') |
+-------------------------------------------+
| 3 |
+-------------------------------------------+
- 未找到匹配项
SELECT FIND_IN_SET('orange', 'apple,banana,cherry');
+--------------------------------------------+
| FIND_IN_SET('orange', 'apple,banana,cherry') |
+--------------------------------------------+
| 0 |
+--------------------------------------------+
- NULL 值处理
SELECT FIND_IN_SET(NULL, 'a,b,c'), FIND_IN_SET('b', NULL);
+---------------------------+-------------------------+
| FIND_IN_SET(NULL, 'a,b,c') | FIND_IN_SET('b', NULL) |
+---------------------------+-------------------------+
| NULL | NULL |
+---------------------------+-------------------------+
- 空字符串处理
SELECT FIND_IN_SET('', 'a,b,c'), FIND_IN_SET('a', '');
+-------------------------+-----------------------+
| FIND_IN_SET('', 'a,b,c') | FIND_IN_SET('a', '') |
+-------------------------+-----------------------+
| 0 | 0 |
+-------------------------+-----------------------+
- 包含逗号的字符串(无法正确匹配)
SELECT FIND_IN_SET('a,b', 'a,b,c,d');
+------------------------------+
| FIND_IN_SET('a,b', 'a,b,c,d') |
+------------------------------+
| 0 |
+------------------------------+
- 大小写敏感匹配
SELECT FIND_IN_SET('B', 'a,b,c'), FIND_IN_SET('b', 'A,B,C');
+---------------------------+---------------------------+
| FIND_IN_SET('B', 'a,b,c') | FIND_IN_SET('b', 'A,B,C') |
+---------------------------+---------------------------+
| 0 | 0 |
+---------------------------+---------------------------+
- 部分匹配不会成功
SELECT FIND_IN_SET('ap', 'apple,banana,cherry');
+---------------------------------------+
| FIND_IN_SET('ap', 'apple,banana,cherry') |
+---------------------------------------+
| 0 |
+---------------------------------------+
- 数字字符串查找
SELECT FIND_IN_SET('2', '1,2,3,10,20');
+--------------------------------+
| FIND_IN_SET('2', '1,2,3,10,20') |
+--------------------------------+
| 2 |
+--------------------------------+