2012-01-10 103 views
2

我有一组行检查数组是否值查询的一个子集?

从用户WHERE

SELECT ID ...

1 
2 
6 
8 
9 

的,我已经和阵列与价值2,3,6

我怎样才能SQL查询该数组是查询结果的子集?

+0

可能[SQL选择所有存在子集的行](http://stackoverflow.com/questions/8425232/sql-select-all-rows-where-subset-exists) – onedaywhen 2012-01-10 14:13:24

回答

2

SQL不支持这样的支持数组,所以我不完全确定如何你正在存储你的数组数组,并且这将影响回答这个问题的最佳方式。

这么说,我应该这样做:

SELECT u.id 
FROM Users U 
    RIGHT JOIN Numbers N 
     ON U.id=N.Number 
WHERE N.Number IN (2,3,6) 

这是基本的查询;来自那里的确切细节取决于你将如何检测失败。 u.ID为NULL的任何记录都表明它不是子集。如果不立即实际所需的一组ID的,你可以将它修改为

SELECT COUNT(*) AS Missing 
FROM Users U 
    RIGHT JOIN Numbers N 
     ON U.id=N.Number 
WHERE N.Number IN (2,3,6) 
AND u.id IS NULL 

,并在任何缺少的是> 0,你就知道你没有一个子集。 (在SQL Server中,至少可以将int转换为一点来获得0 = false,如果应用程序更易于使用,则0 = true。)

其他详细信息我们可以添加更多关于什么的信息你实际上正在努力,但希望这是一个基本的技术是有道理的。

(NB这一切假设你已经在你的数据库有一个数字/理货表。他们是非常有用的话,如果你有没有准备好,我会得到一个成立。)

1

使用Dynamic SQL

declare @cmd varchar(200) 
select @cmd = "select id from Users WHERE id in (" + @array + ")" 

exec(@cmd) 
+0

不,不是'IN'子句,您的查询正在做另一种方式,使选定的ID将从数组限制。 – 2012-01-10 13:55:29

+0

你想检查2,3,6是否都在表中?或者他们按照这个顺序出现?究竟是什么? – 2012-01-10 13:57:58

+0

如果你想检查这个列表是否是一个确定的子集,那么你还需要计算数组中元素的数量,并将其与此操作中返回集的长度进行比较。 – eftpotrm 2012-01-10 15:32:24

2

你必须逐个检查每个记录/项目,再算上他们。

如果JOIN的大小与数组大小相同,则该数组是该表的子集。

这里是假设你的数组中的一个表的例子...

SELECT 
    COUNT(*) 
FROM 
    Users 
INNER JOIN 
    search 
    ON search.id = Users.id 
HAVING 
    COUNT(*) = (SELECT COUNT(*) FROM search) 
1

如果你能填充一个栏表格,你需要再次进行测试,那么你可以做到这一点的值。

Select count(*) 
From 
    (
     Select id 
     From users 
     Intersect 
     Select id 
     From testValues 
    ) test 

如果count等于您正在测试的值的数量,则该数组将形成子集。

+0

当然这假定您正在使用带相交的SQL变体。德姆的解决方案应该无处不在。 – 2012-01-10 14:10:48

相关问题