Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql检查数字是否在逗号分隔的列表中_Mysql_List - Fatal编程技术网

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

mysql检查数字是否在逗号分隔的列表中,mysql,list,Mysql,List,我有一张这样的桌子: UID(int) NUMBERS(blob) ---------------------- 1 1,13,15,20 2 3,10,15,20 3 3,15 我想测试3和15是否在称为数字的blob中。并且可以看到,LIKE%%无法使用 只能选择ID为2和3的行…不是最漂亮的解决方案,但它可以工作: select UID from YOUR_TABLE where find_in_set('3', cast(NU

我有一张这样的桌子:

UID(int) NUMBERS(blob)
----------------------
1        1,13,15,20
2        3,10,15,20
3        3,15
我想测试3和15是否在称为数字的blob中。并且可以看到,LIKE%%无法使用


只能选择ID为2和3的行…

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

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
请注意,这是字符串比较,因此您可能还需要将输入参数强制转换为char。

此方法也适用于:

SELECT * FROM table WHERE 3 IN (NUMBERS) AND 15 IN (NUMBERS)
使用IN将查找逗号分隔的字符串,例如这两个

WHERE banana IN ('apple', 'banana', 'coconut')
WHERE 3 IN (2,3,6,8,90)

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

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

i、 e


您可以尝试以下操作:

 SELECT * FROM table_name WHERE FIND_IN_SET('3', NUMBERS) AND  FIND_IN_SET('15', NUMBERS)
在集合中查找

在mysql中创建一个新函数,并粘贴以下内容,顺便说一句,这不是我的作品

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 $$

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 ;
请尝试以下查询:

SELECT UID FROM table WHERE NUMBERS REGEXP "[[:<:]](3|10)[[:>:]]"

谢谢你的帮助。我发现了一个带有exmaple的页面,用于搜索逗号分隔的值。我把它贴出来作为答复。我猜你的解决方案会很好的,但对我来说是可行的。下面是一个示例:从用户那里选择id,在文章中找到,从文章中选择编辑器,在文章中找到,因为另一个答案也是对的,所以接受自己的答案感觉很糟糕。但是IN似乎比find_IN_集合更正确,尽管这也会起作用。喝了几杯啤酒后编码让我想到了这个问题。非常有用,谢谢!警告:这个答案可能是错误的,因为。我想,在集合中查找集合是更明智的选择。正如drdaeman所指出的,当要搜索的值是INT时,这不起作用,除非搜索的值恰好是集合中的第一个。我有一个视图,其中一列包含逗号分隔的值,该列是使用GROUP_CONCAT创建的,并且该解决方案在该场景中似乎不起作用,但是find_in_集合确实如此,我想我可以分享我的发现。谢谢你的发布。不知道functionAnybody知道在哪里可以找到这个函数的详细信息吗?我找不到对它的任何引用,链接也不再起作用了……该函数“find_IN_SET_X”不存在。在任何地方都没有关于它的引用。在集合中查找似乎是一个用户定义的函数。例如,by@Rodolfo Souza。的可能副本请详细说明正则表达式。[[::]:这些标记表示单词边界,因此,它们分别匹配单词的开头和结尾。
SELECT UID FROM table WHERE NUMBERS REGEXP "[[:<:]](3|10)[[:>:]]"