另一个标题可能是:检查是否存在多行?
如果将列表中的所有产品都存在于表中,则希望结合使用SQL和C#来使方法返回true。如果可以用SQL完成所有操作,那将是更好的选择。我编写了一种方法,该方法productID使用以下SQL返回单个对象是否存在:
productID
SELECT productID FROM Products WHERE ProductID = @productID
如果返回一行,则c#方法返回true,否则返回false。
现在,我想知道是否有产品ID列表(请注意,通常列表中的20个以下列表不是一个大列表)。如何编写一个查询,如果所有产品ID都存在,则返回一行;如果一个或多个产品ID不存在,则不返回行?
(Maybe something involving "IN" like: SELECT * FROM Products WHERE ProductID IN ('1', '10', '100', 'ABC'))
编辑:
结果的表达方式对我来说并不重要。查询返回a1或0,空结果集还是非空结果集,true或false都无关紧要。我希望答案是1)易于阅读和理解,以及2)表现出色
1
0
我设想将产品ID的列表与SQL串联在一起。显然,这使代码可以进行SQL注入(产品ID实际上是varchar。在这种情况下,机会很小,但仍然希望避免这种可能性)。因此,如果有解决办法,那就更好了。使用SQL Server 2005。
varchar
产品编号为 varchar
给您更新的问题,这些是最简单的形式:
如果ProductID要独特
ProductID
SELECT COUNT(*) FROM Products WHERE ProductID IN (1, 10, 100)
然后对照3查询的产品数量检查结果(这最后一部分可以在SQL中完成,但在C#中可能更容易完成,除非您在SQL中进行更多操作)。
3
如果ProductID不是唯一的,那就是
SELECT COUNT(DISTINCT ProductID) FROM Products WHERE ProductID IN (1, 10, 100)
当问题被认为要求返回所有ProductIds存在的行时,否则都没有返回行:
ProductIds
SELECT ProductId FROM Products WHERE ProductID IN (1, 10, 100) AND ((SELECT COUNT(*) FROM Products WHERE ProductID IN (1, 10, 100))=3)
或者
SELECT ProductId FROM Products WHERE ProductID IN (1, 10, 100) AND ((SELECT COUNT(DISTINCT ProductID) FROM Products WHERE ProductID IN (1, 10, 100))=3)
如果您实际上打算对结果做些事情。否则,简单的SELECT 1 WHERE (SELECT ...)=3意愿就会像其他答案所陈述或暗示的那样起作用。
SELECT 1 WHERE (SELECT ...)=3