MySQL FIND_IN_SET Function

摘要:在本教程中,您将学习如何使用MySQL FIND_IN_SET()函数返回字符串在逗号分隔的字符串列表中的位置。

MySQL FIND_IN_SET()函数简介

MySQL 提供了一个名为FIND_IN_SET()的内置字符串函数,它允许您在以逗号分隔的字符串列表中查找字符串的位置。

下面说明了FIND_IN_SET函数的语法:

FIND_IN_SET(needle,haystack);Code language: SQL (Structured Query Language) (sql)

FIND_IN_SET函数接受两个参数:

  • 第一个参数needle是您要查找的字符串。
  • 第二个参数haystack是要搜索的以逗号分隔的字符串列表。

FIND_IN_SET()函数根据参数的值返回一个整数或NULL值:

  • 如果needlehaystack为 NULL,则返回NULL值。
  • 如果needle不在haystack或者haystack是空字符串,则返回零。
  • 如果needlehaystack中,则返回正整数。

请注意,如果needle中包含逗号 (,),则该功能将无法正常工作。另外,如果needle是常量字符串并且haystackSET类型的列,MySQL将使用位算术优化。

MySQL FIND_IN_SET()示例

让我们通过一些例子来了解MySQL FIND_IN_SET是如何工作的。

一)MySQL FIND_IN_SET()函数简单示例

以下语句返回 2,因为 y 位于'x,y,z'字符串中的第二个位置。

SELECT FIND_IN_SET('y','x,y,z'); -- 2Code language: SQL (Structured Query Language) (sql)

试试看

以下语句返回 0,因为a不在'x,y,z'列表中。

SELECT FIND_IN_SET('a','x,y,z');Code language: SQL (Structured Query Language) (sql)

试试看

以下语句也返回 0,因为第二个参数为空。

SELECT FIND_IN_SET('a','');Code language: SQL (Structured Query Language) (sql)

试试看

以下语句返回NULL因为第一个参数是NULL

SELECT FIND_IN_SET(NULL,'x,y,z');Code language: SQL (Structured Query Language) (sql)

试试看

以下语句也返回NULL ,因为第二个参数是NULL

SELECT FIND_IN_SET('a',NULL);Code language: SQL (Structured Query Language) (sql)

试试看

B) 使用MySQL FIND_IN_SET()函数从表中查询数据示例

首先,使用以下语句创建一个名为divisions新表

CREATE TABLE IF NOT EXISTS divisions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(25) NOT NULL,
    belts VARCHAR(200) NOT NULL
);Code language: SQL (Structured Query Language) (sql)

其次,将一些行插入divisions表中。

INSERT INTO divisions(name,belts)
VALUES ('O-1','white,yellow,orange'),
	('O-2','purple,green,blue'),
	('O-3','brown,red,black'),
	('O-4','white,yellow,orange'),
	('O-5','purple,green,blue'),
	('O-6','brown,red'),
	('O-7','black'),
	('O-8','white,yellow,orange'),
	('O-9','purple,green,blue'),
	('O-10','brown,red');
Code language: SQL (Structured Query Language) (sql)

第三,要查找接受red带的分区,可以使用FIND_IN_SET()函数,如以下查询所示:

SELECT 
    name, 
    belts
FROM
    divisions
WHERE
    FIND_IN_SET('red', belts);Code language: SQL (Structured Query Language) (sql)

MySQL FIND_IN_SET example

否定FIND_IN_SET()函数

因为当在第二个参数中找不到第一个参数时, FIND_IN_SET()函数返回零,这在 MySQL 中为FALSE 。因此,您可以使用NOT运算符来否定FIND_IN_SET()函数。

此示例使用NOT运算符和FIND_IN_SET()函数来查找不接受黑带的分区:

SELECT 
    name, belts
FROM
    divisions
WHERE
    NOT FIND_IN_SET('black', belts);Code language: SQL (Structured Query Language) (sql)
MySQL FIND_IN_SET 函数示例

MySQL FIND_IN_SET()函数与IN运算符

IN运算符确定某个值是否与集合中的任何值匹配。以下示例使用IN运算符查找名称为O-1O-2的部门:

SELECT 
    name, belts
FROM
    divisions
WHERE
    name IN ('O-1' , 'O-2');Code language: SQL (Structured Query Language) (sql)
MySQL FIND_IN_SET 与 IN 运算符

此语句使用FIND_IN_SET()函数并返回与上述查询相同的结果:

SELECT 
    name, 
    belts
FROM
    divisions
WHERE
    FIND_IN_SET(name, 'O-1,O-2');Code language: SQL (Structured Query Language) (sql)

因此column IN (x, y, z)表达式与FIND_IN_SET(column, 'x,y,z')相同。

IN运算符可以采用任意数量的参数,每个参数用逗号分隔,而FIND_IN_SET()函数只能采用两个参数。

当您想要将某个值与列表中的任何值进行匹配时,可以使用IN运算符。当您想要将某个值与逗号分隔的值列表进行匹配时,可以使用FIND_IN_SET()函数。

在本教程中,您学习了如何使用 MySQL FIND_IN_SET()函数在逗号分隔的字符串列表中查找字符串。

本教程有帮助吗?