mysql检查数字是否在逗号分隔列表中

Til*_*eck 29 mysql list

我有这样一张桌子:

UID(int) NUMBERS(blob)
----------------------
1        1,13,15,20
2        3,10,15,20
3        3,15
Run Code Online (Sandbox Code Playgroud)

我想测试3和15是否在名为NUMBERS的blob中.并且可以看到LIKE %%无法使用

只选择ID为2的行和三个scoulb ...

Til*_*eck 42

这个也有效:

SELECT * FROM table WHERE 3 IN (NUMBERS) AND 15 IN (NUMBERS)
Run Code Online (Sandbox Code Playgroud)

使用IN将查看逗号分隔的字符串,例如.这两个

WHERE banana IN ('apple', 'banana', 'coconut')
WHERE 3 IN (2,3,6,8,90)
Run Code Online (Sandbox Code Playgroud)

在此页面上找到的信息:

  • 警告:这个答案可能是错误的*,因为[`foo IN('1,2,3')≡fooIN(CAST('1,2,3'AS INT))≡fooIN(1)`]( http://stackoverflow.com/a/4156063/116546).我猜,`find_in_set`是更理智的选择. (19认同)
  • 正如drdaeman所指出的,当被搜索的值是INT时,这不起作用,除非搜索的值恰好是集合中的第一个. (4认同)

Bjö*_*örn 35

不是最漂亮的解决方案,但它的工作原理:

select
   UID
from
   YOUR_TABLE
where
   find_in_set('3', cast(NUMBERS as char)) > 0
   and
   find_in_set('15', cast(NUMBERS as char)) > 0
Run Code Online (Sandbox Code Playgroud)

请注意,它是字符串比较,因此您可能还需要将输入参数转换为char.


小智 15

你可以尝试像下面这样:

 SELECT * FROM table_name WHERE FIND_IN_SET('3', NUMBERS) AND  FIND_IN_SET('15', NUMBERS)
Run Code Online (Sandbox Code Playgroud)


小智 8

还要检查这是否对任何人都有帮助

这是一个扩展功能,用于消除FIND_IN_SET()MySQL中本机的限制,这个新的扩展版本FIND_IN_SET_X()提供了将一个列表与另一个列表进行比较的功能.

mysql> SELECT FIND_IN_SET_X('x,c','a,b,c,d'); -> 3 
Run Code Online (Sandbox Code Playgroud)

查看此链接以获取更多详细信息.

  • 该函数'FIN_IN_SET_X'不存在.关于它没有任何参考. (4认同)

Rod*_*uza 5

功能已为您完成

DELIMITER $$

CREATE FUNCTION `FIND_IN_SET_X`(inputList TEXT,targetList TEXT) RETURNS INT(11)
    DETERMINISTIC
BEGIN
  DECLARE limitCount INT DEFAULT 0 ;
  DECLARE counter INT DEFAULT 0 ;
  DECLARE res INT DEFAULT 0 ;
  DECLARE temp TEXT ;
  SET limitCount = 1 + LENGTH(inputList) - LENGTH(REPLACE(inputList, ',', '')) ;
  simple_loop :
  LOOP
    SET counter = counter + 1 ;
    SET temp = SUBSTRING_INDEX(SUBSTRING_INDEX(inputList, ',', counter),',',- 1) ;
    SET res = FIND_IN_SET(temp, targetList) ;
    IF res > 0 
    THEN LEAVE simple_loop ;
    END IF ;
    IF counter = limitCount 
    THEN LEAVE simple_loop ;
    END IF ;
  END LOOP simple_loop ;
  RETURN res ;
END$$

DELIMITER ;
Run Code Online (Sandbox Code Playgroud)