MySQL FIND_IN_SET函数

时间:2019-11-20 08:52:25  来源:igfitidea点击:

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

MySQL FIND_IN_SET()函数简介

MySQL提供了一个称为FIND_IN_SET()的内置字符串函数,该函数可让您在逗号分隔的字符串列表中查找字符串的位置。

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

FIND_IN_SET(needle,haystack);

FIND_IN_SET函数接受两个参数:

  • 第一个参数指针是您要查找的字符串。

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

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

  • 如果needle或haystack均为NULL,则返回NULL值。

  • 如果针不在干草堆中或干草堆是空字符串,则返回零。

  • 如果针位于大海捞针中,则返回正整数。

请注意,如果针头包含逗号(,),该功能将无法正常工作。
另外,如果指针是一个常量字符串,而干草堆是一个SET类型的列,则MySQL将使用位算法优化。

MySQL FIND_IN_SET()示例

让我们举一些例子来了解MySQL FIND_IN_SET的工作原理。

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

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

SELECT FIND_IN_SET('y','x,y,z'); -- 2

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

SELECT FIND_IN_SET('a','x,y,z');

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

SELECT FIND_IN_SET('a','');

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

SELECT FIND_IN_SET(NULL,'x,y,z');

以下语句还返回NULL,因为第二个参数为NULL。

SELECT FIND_IN_SET('a',NULL);

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

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

CREATE TABLE IF NOT EXISTS divisions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(25) NOT NULL,
    belts VARCHAR(200) NOT NULL
);

其次,将一些行插入细分表。

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');

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

SELECT 
    name, 
    belts
FROM
    divisions
WHERE
    FIND_IN_SET('red', belts);

取反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);

MySQL FIND_IN_SET()函数与IN运算符

IN运算符确定一个值是否与集合中的任何值匹配。
下面的示例使用IN运算符查找名称为O-1或O-2的除法:

SELECT 
    name, belts
FROM
    divisions
WHERE
    name IN ('O-1' , 'O-2');

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

SELECT 
    name, 
    belts
FROM
    divisions
WHERE
    FIND_IN_SET(name, 'O-1,O-2');

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

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

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

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