一尘不染

SQL:如果记录列表存在,则返回``rue''?

sql

另一个标题可能是:检查是否存在多行?

如果将列表中的所有产品都存在于表中,则希望结合使用SQL和C#来使方法返回true。如果可以用SQL完成所有操作,那将是更好的选择。我编写了一种方法,该方法productID使用以下SQL返回单个对象是否存在:

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'))

编辑:

结果的表达方式对我来说并不重要。查询返回a10,空结果集还是非空结果集,true或false都无关紧要。我希望答案是1)易于阅读和理解,以及2)表现出色

我设想将产品ID的列表与SQL串联在一起。显然,这使代码可以进行SQL注入(产品ID实际上是varchar。在这种情况下,机会很小,但仍然希望避免这种可能性)。因此,如果有解决办法,那就更好了。使用SQL
Server 2005。

产品编号为 varchar


阅读 203

收藏
2021-03-17

共1个答案

一尘不染

给您更新的问题,这些是最简单的形式:

如果ProductID要独特

SELECT COUNT(*) FROM Products WHERE ProductID IN (1, 10, 100)

然后对照3查询的产品数量检查结果(这最后一部分可以在SQL中完成,但在C#中可能更容易完成,除非您在SQL中进行更多操作)。

如果ProductID不是唯一的,那就是

SELECT COUNT(DISTINCT ProductID) FROM Products WHERE ProductID IN (1, 10, 100)

当问题被认为要求返回所有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意愿就会像其他答案所陈述或暗示的那样起作用。

2021-03-17