我有一组行
来自用户WHERE ...
的SELECT id1
2
6
8
9
我和数组的值为2,3,6
如何在 SQL 中检查数组是否是查询结果的子集?
答案 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
如果计数等于您正在测试的值的数量,则数组形成一个子集。