Mysql 检查SQL数组中的多个值
我需要检查SQL数组中是否存在多个值中的一个或多个。 最简单的形式是这样的:Mysql 检查SQL数组中的多个值,mysql,sql,arrays,Mysql,Sql,Arrays,我需要检查SQL数组中是否存在多个值中的一个或多个。 最简单的形式是这样的: SELECT (1, 7, 8) IN (1, 2, 3, 4, 5) FROM DUAL SELECT 1 IN (1, 2, 3, 4, 5) OR 7 IN (1, 2, 3, 4, 5) OR 8 IN (1, 2, 3, 4, 5) FROM DUAL 显然,这种说法行不通。只有在数组中只检查一个值时,它才起作用。但我需要知道,如果一个不是全部!SQL数组中存在我提供的所有值。如果数组中存在一个
SELECT
(1, 7, 8) IN (1, 2, 3, 4, 5)
FROM DUAL
SELECT
1 IN (1, 2, 3, 4, 5)
OR 7 IN (1, 2, 3, 4, 5)
OR 8 IN (1, 2, 3, 4, 5)
FROM DUAL
显然,这种说法行不通。只有在数组中只检查一个值时,它才起作用。但我需要知道,如果一个不是全部!SQL数组中存在我提供的所有值。如果数组中存在一个或多个值,则该语句应返回TRUE;如果没有值,则返回FALSE
我意识到我可以添加几张支票,如下所示:
SELECT
(1, 7, 8) IN (1, 2, 3, 4, 5)
FROM DUAL
SELECT
1 IN (1, 2, 3, 4, 5)
OR 7 IN (1, 2, 3, 4, 5)
OR 8 IN (1, 2, 3, 4, 5)
FROM DUAL
但是,我的编程逻辑以数组格式1、7、8提供值,每次需要运行SQL语句时,该数组中的值量都不同。如果我能以某种方式将这个数组粘贴到现有的SQL语句中,而不是每次运行时都重新生成SQL语句,并为数组中的每个值创建OR语句,这将非常方便
有办法做到这一点吗?顺便说一句,我正在使用MySQL
提前Thanx,继续做好编程 可以使用简单联接创建动态/临时表并与其他值进行简单联接吗
create table a (
id int);
insert into a values (1),(7),(8);
create table b like a;
insert into b values (1),(2),(3),(4),(5);
select a.* from a
inner join b
on a.id = b.id
可以将REGEXP与逗号分隔的字符串一起使用。您必须首先将值转换为字符串
SELECT REPLACE(CONCAT(",", "1, 7, 8", ",")," ", "")
REGEXP CONCAT(",", REPLACE(REPLACE("1 ,2 , 3 , 4 ,5 " ," ", ""),",", ",|,"), ",")
FROM DUAL
说明:
这仅适用于逗号分隔的字符串,而不适用于列表中的列表
实例
该语句从字符串中删除所有空格。
在字符串的两端添加逗号以避免部分匹配。
在正则表达式模式中,所有逗号都替换为逗号+管道符号+逗号,因此
用作OR,同时避免部分匹配。
您的编程逻辑是否可以传递一个表,因为SQL最适合于表,而不是分隔列表?这个表是什么样子的?如果类似于:从DUAL中选择1,7,8,那么这是可能的,但我可以将其构建到SQL语句中。我仍然不知道如何测试SQL数组的值。在.net中,比如datatable或数组。逗号分隔的列表不是数组,这是一个字符串。为什么在MySQL中需要对其求值?我理解这一点,但我想将这些值粘贴到现有的SQL语句中,因此我将数组转换为逗号分隔的列表。我很好奇,对于您的答案和从a中选择a.*的查询计划是否相同,其中a.id在从b中选择b.id。你认为一个解释会揭示这两个问题实际上是相同的吗?@Kirk Olson。不客气。@克里斯·坎宁安。我通常倾向于避免使用IN子句,因为在mysql版本<5.5的情况下,速度会慢一些,但我不是像Quassnoi和其他SO用户那样的sql查询优化专家@nick rulez我希望Kirk能帮我们解释并让我们知道。还有时间成为专家!