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

Use*_*ser 31 c# sql conditional boolean exists

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

使用SQL和C#的组合,如果列表中的所有产品都存在于表中,我希望方法返回true.如果它可以在SQL中完成,那将是更好的选择.我编写了一个方法,productID使用以下SQL 返回单个是否存在:

SELECT productID FROM Products WHERE ProductID = @productID
Run Code Online (Sandbox Code Playgroud)

如果返回一行,则c#方法返回true,否则返回false.

现在我想知道我是否有产品ID清单(不是一个很大的清单,通常在20岁以下).如果所有产品ID都存在则如何编写将返回一行的查询,如果一个或多个产品ID不存在则如何不返回行?

(Maybe something involving "IN" like:
SELECT * FROM Products WHERE ProductID IN ('1', '10', '100', 'ABC'))
Run Code Online (Sandbox Code Playgroud)

编辑:

如何表达结果对我来说并不重要.无论查询返回1or 0,空结果集还是非空结果集,true或false都无关紧要.我更喜欢这样的答案:1)易于阅读和理解,2)高效

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

产品ID是 varchar

Mar*_*urd 21

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

如果ProductID你想要的是独特的

SELECT COUNT(*) FROM Products WHERE ProductID IN (1, 10, 100)
Run Code Online (Sandbox Code Playgroud)

然后检查结果3,查询你正在查询的产品数量(最后一部分可以在SQL中完成,但在C#中可能更容易,除非你在SQL中做得更多).

如果ProductID不是唯一的话

SELECT COUNT(DISTINCT ProductID) FROM Products WHERE ProductID IN (1, 10, 100)
Run Code Online (Sandbox Code Playgroud)

当问题被认为需要在所有ProductIds存在时返回行,否则不会:

SELECT ProductId FROM Products WHERE ProductID IN (1, 10, 100) AND ((SELECT COUNT(*) FROM Products WHERE ProductID IN (1, 10, 100))=3)
Run Code Online (Sandbox Code Playgroud)

要么

SELECT ProductId FROM Products WHERE ProductID IN (1, 10, 100) AND ((SELECT COUNT(DISTINCT ProductID) FROM Products WHERE ProductID IN (1, 10, 100))=3)
Run Code Online (Sandbox Code Playgroud)

如果你真的打算对结果做些什么.否则简单SELECT 1 WHERE (SELECT ...)=3就会像其他答案所陈述或暗示的那样.


Mic*_*uen 11

@Mark Hurd,谢谢你指出错误.

这将工作(如果你使用Postgresql,Sql Server 2008):

create table products
(
product_id int not null
);



insert into products values(1),(2),(10),(100);

SELECT 
    CASE 
        WHEN EXISTS(
             SELECT 1 
             FROM (values(1),(10),(100)) as x(id) 
             WHERE x.id NOT IN (select product_id from products))
        THEN 0 --'NOT ALL'

        ELSE 1 -- 'ALL'
    END
Run Code Online (Sandbox Code Playgroud)

如果您使用的是MySQL,请创建一个临时内存表(然后在那里填充1,10,100):

create table product_memory(product_id int) engine=MEMORY;

insert into product_memory values(1),(10),(100);

SELECT 
    CASE 
        WHEN EXISTS(
             SELECT 1 
             FROM product_memory
             WHERE product_memory.id NOT IN (select product_id from products))
        THEN 0 -- 'NOT ALL'

        ELSE 1 -- 'ALL'
    END
Run Code Online (Sandbox Code Playgroud)

在你的C#代码上:

bool isAllExist = (int)(new SqlCommand(queryHere).ExecuteScalar()) == 1;
Run Code Online (Sandbox Code Playgroud)

[编辑]

如果所有产品ID都存在则如何编写将返回一行的查询,如果一个或多个产品ID不存在则如何不返回行?

关于,如果所有行都存在则返回一行(单数),如果一个或多个产品ID不存在则不返回:

MySQL的:

SELECT 1
WHERE 
    NOT EXISTS(
        SELECT 1
             FROM product_memory
             WHERE product_memory.id NOT IN (select product_id from products) )
Run Code Online (Sandbox Code Playgroud)

Posgresql,Sql Server 2008:

SELECT 1
WHERE 
    NOT EXISTS(            
        SELECT 1 
        FROM (values(1),(10),(100)) as x(id) 
        WHERE x.id NOT IN (select product_id from products) )
Run Code Online (Sandbox Code Playgroud)

然后在你的C#代码上:

var da = new SqlDataAdapter(queryhere, connectionhere);
var dt = new DataTable();
da.Fill(dt);

if (dt.Rows.Count > 0) 
    return true; 
else 
    return false;
Run Code Online (Sandbox Code Playgroud)

或者只是缩短条件:

return dt.Rows.Count > 0;
Run Code Online (Sandbox Code Playgroud)


Mah*_*alt 11

这是我通常这样做的方式:

只需用此语句替换您的查询SELECT * FROM table WHERE 1

   SELECT
      CASE WHEN EXISTS 
      (
            SELECT * FROM table WHERE 1
      )
      THEN 'TRUE'
      ELSE 'FALSE'
   END
Run Code Online (Sandbox Code Playgroud)

  • 至少在 postgres 上,这可以简化为:`SELECT EXISTS ( SELECT * FROM table WHERE 1 )` (2认同)