在我的C#代码中,我必须像这样执行SQL查询:
context.ExecuteStoreQuery("SELECT * FROM MyTable WHERE Field0 = {0} AND
Field1 = {1}", field0, field1)
当c中的field1 = null且数据库中为NULL时,此查询不起作用。 (我必须使用与IS NULL不同的语法)
如何在不制作if的情况下纠正此问题(实际上,我有10个字段......)?
答案 0 :(得分:4)
默认情况下,SQL Server不允许您将值与null
进行比较。所有比较都解析为false
,即使是逻辑相反的也是如此。换句话说,你可以这样做:
where field = 1
和where field <> 1
。如果field
为null,则逻辑上都解析为false。
在任何情况下,您都需要在查询中明确检查null
:
context.ExecuteStoreQuery(@"SELECT * FROM MyTable WHERE
(Field0 = {0} or (Field0 is null and {0} is null)) AND
(Field1 = {1} or (Field1 is null and {0} is null))", field0, field1)
答案 1 :(得分:0)
您可以使用if语句的简短变体。 如果没有if语句,我认为你不能处理你的问题。 例如:
String.Format("SELECT * FROM MyTable WHERE Field0 {0} ", value==null ? "IS NULL" : String.Format("= {0}", value))
也可以使用“@ParameterName”
来参数化查询context.ExecuteStoreQuery<ProductionUnit>(
String.Format("SELECT * FROM MyTable WHERE Field0 {0} @Parameter1",
value==null ? "IS", "="), new SqlParameter("@Parameter1", value));
此致
答案 2 :(得分:0)
public string appendCondition(String sqlQuery, String field, Object value)
{
string resultQuery = sqlQuery + " " + value == null ? " IS NULL " : "=" + value.ToString();
return resultQuery;
}
希望你能添加简单的逻辑来自己添加“WHERE”或“AND”。
答案 3 :(得分:0)
好吧,我要做的第一件事就是删除select *。 BAD!
我要做的第二件事是将其作为存储过程。
create procedure dbo.MyTableSelect
@field0 int,
@field1 int=null
as
begin
select
*
from MyTable
where Field0=@field0
and (@field1 is null or Field1=@field1)
end
然后您可以将代码更改为此
context.ExecuteStoreQuery("exec dbo.MyTableSelect @field0={0}, @field1 = {1}", field0, field1)