检查数组是否为查询的子集值?

时间:2012-01-10 13:49:33

标签: sql

我有一组行

来自用户WHERE ...

的SELECT id
1
2
6
8
9

我和数组的值为2,3,6

如何在 SQL 中检查数组是否是查询结果的子集?

4 个答案:

答案 0 :(得分:2)

您必须单独检查每个记录/项目,然后计算它们。

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

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

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

答案 1 :(得分: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

并且,每当Missing是> 0你知道你没有子集。 (在SQL Server中,至少可以将int转换为一个位以获得0 = false,如果您的应用程序更容易使用,则为0 = true。)

我们可以添加其他详细信息,并提供有关您实际尝试的内容的更多信息,但希望这是一种基本技术。

(N.B。这一切都假设你的数据库中有一个数字/计数表。它们非常有用,所以,如果你还没有,我会得到一个。)

答案 2 :(得分:1)

使用Dynamic SQL

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

exec(@cmd)

答案 3 :(得分:1)

如果您可以使用需要测试的值填充一列表,则可以执行此操作。

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

如果计数等于您正在测试的值的数量,则数组形成一个子集。