SQL:如果记录列表存在,则返回“true”?

新手上路,请多包涵

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

结合使用 SQL 和 C#,如果列表中的所有产品都存在于表中,我希望方法返回 true。如果它可以在 SQL 中完成,那将是可取的。我编写了一个方法,使用以下 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'))

编辑:

结果如何表达对我来说并不重要。查询是否返回 10 ,空结果集或非空结果集,真或假都没有关系。我更喜欢 1) 易于阅读和理解和 2) 高性能的答案

我设想将产品 ID 列表与 SQL 连接起来。显然,这会将代码打开到 SQL 注入(产品 id 实际上是 varchar 。在这种情况下,机会很小,但仍然希望避免这种可能性)。所以如果有办法解决这个问题会更好。使用 SQL Server 2005。

产品 ID 是 varchar

原文由 User 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

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

如果 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 将按照其他答案所述或暗示的方式进行。

原文由 Mark Hurd 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于 PostgreSQL:

 SELECT COUNT(*) = 1 FROM (
  SELECT 1 FROM $table WHERE $condition LIMIT 1
) AS t

原文由 multitask landscape 发布,翻译遵循 CC BY-SA 4.0 许可协议