详解MySQL的FIND_IN_SET()函数:在逗号分隔的字符串中查找一个值

  • Post category:MySQL

MySQL的FIND_IN_SET()函数主要用于在一个逗号分隔的字符串列表中查找是否包含某个字符串值,并返回其出现的位置。以下是该函数的使用方法及其两个实例说明:

FIND_IN_SET()函数的语法和参数

FIND_IN_SET()函数的语法如下:

FIND_IN_SET(string, string_list)

其中:

  • string为需要查找的字符串值;
  • string_list为逗号分隔的字符串列表。

FIND_IN_SET()函数的返回值

如果找到了string,则该函数返回其在string_list中排列的位置序号,序号从1开始。如果没有找到,函数返回0。

实例一:查找多个值是否存在于一个字符串列表中

例如,我们要查找字符串“apple”和“banana”是否存在于字符串“apple,banana,orange,pineapple”中,可以使用以下SQL语句:

SELECT FIND_IN_SET('apple', 'apple,banana,orange,pineapple') AS result1, 
       FIND_IN_SET('banana', 'apple,banana,orange,pineapple') AS result2,
       FIND_IN_SET('orange', 'apple,banana,orange,pineapple') AS result3,
       FIND_IN_SET('watermelon', 'apple,banana,orange,pineapple') AS result4;

执行后,将返回如下结果:

+---------+---------+---------+---------+
| result1 | result2 | result3 | result4 |
+---------+---------+---------+---------+
|       1 |       2 |       3 |       0 |
+---------+---------+---------+---------+

由此可以看出,FIND_IN_SET()函数可以轻松地检查多个值在一个字符串列表中的存在情况。

实例二:使用CASE语句在查询结果中返回自定义的值

例如,我们要查询表格中不同产品的销售状态,其中产品状态用一个逗号分隔的字符串表示,状态值对应如下:

  • 0 表示未上架;
  • 1 表示已上架;
  • 2 表示已售罄;
  • 3 表示已下架。

如下SQL语句可以使用FIND_IN_SET()函数实现该需求,并使用CASE语句返回自定义的状态值:

SELECT 
    product_name, 
    product_status,
    CASE 
        WHEN FIND_IN_SET('3', product_status) THEN '已下架' 
        WHEN FIND_IN_SET('0', product_status) THEN '未上架'
        WHEN FIND_IN_SET('2', product_status) THEN '已售罄'
        WHEN FIND_IN_SET('1', product_status) THEN '已上架'
    END AS status_name
FROM products;

执行后,将返回一个查询结果:

+-------------------+-----------------+-------------+
|   product_name    |  product_status | status_name |
+-------------------+-----------------+-------------+
|   iPhone 12 Pro   |      1,2        |    已上架,已售罄  |
|   iPad Air 2020   |       1         |    已上架   |
|   MacBook Air     |      0,1        |    未上架,已上架  |
|   Apple Watch SE  |      2,3        |   已售罄,已下架  |
+-------------------+-----------------+-------------+

可以看到,使用FIND_IN_SET()函数和CASE语句,我们可以方便地将查询结果中的状态值转化为易理解的自定义状态名称。