2011-07-15 49 views
2

我需要检查一个(或多个)多个值是否存在于SQL数组中。 在其最简单的形式,它会是这个样子:检查SQL数组中的多个值

SELECT 
    (1, 7, 8) IN (1, 2, 3, 4, 5) 
FROM DUAL 

显然这种说法是行不通的。它只适用于检查数组中的一个值。但是我需要知道我提供的值中有一个(不是全部!)是否存在于SQL数组中。如果数组中存在一个或多个值,则语句应该返回TRUE;如果没有,则返回FALSE。

我知道我可以只是添加若干检查,例如:然而

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 btw。

Thanx提前,保持良好的编程!

+0

您的“编程逻辑”是否可以传递一个表,因为SQL最适合表,而不是分隔列表? – JNK

+0

这张桌子怎么样? 如果它是这样的: SELECT(1,7,8)FROM DUAL 那么这将是可能的,但我可以将其构建到SQL语句中。我仍然看不到我如何测试SQL数组的值。 –

+0

在.net中就像一个'datatable'或一个数组。逗号分隔的列表不是数组,它是一个字符串。 – JNK

回答

1

您可以使用逗号分隔字符串的REGEXP。您必须首先将值转换为字符串。

SELECT REPLACE(CONCAT(",", "1, 7, 8", ",")," ", "") 
     REGEXP CONCAT(",", REPLACE(REPLACE("1 ,2 , 3 , 4 ,5 " ," ", ""),",", ",|,"), ",") 
FROM DUAL 

说明:

  • 这仅适用于以逗号分隔字符串,不列为在 例子。
  • 该语句从字符串中删除所有空格。
  • 在字符串的两端添加逗号以避免部分匹配。
  • 在正则表达式模式中,所有逗号均由逗号+管道符号+逗号替换,因此它作为OR运行,同时避免部分匹配。
+0

这就像一个魅力!你一定是一位出色的程序员! –

1

你可以使用一个简单的连接创建一个动态/临时表,并与其他值进行简单连接吗?

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 
+0

我很好奇查询计划是否与您的答案和SELECT a。* from a where a.id IN(SELECT b.id FROM b)'相同。你认为'EXPLAIN'会揭示这两个查询是否相同? –

+0

这似乎是一个很好的方法,thanx! –

+0

@ Kirk Olson。别客气。 @克里斯坎宁安。我通常倾向于避免使用IN子句,因为AFAIK在mysql版本<5.5时速度较慢,但​​我不是一个关于像Quassnoi和其他SO用户那样的查询优化的sql专家;) –