我有这样一张桌子:
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)
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)
功能已为您完成
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)