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)