所以我这个屏幕上有许多文本框,这是标准部分。
示例:
输入姓名: _ __ _ _
输入年龄: _ __ _ _
输入高度: _ __ _ _
搜索!
所以,查询是这样的:
select * from....
where
...
and Name = isnull(@name,Name)
and Age= isnull(@Age,Age)
and Height= isnull(@Height,Height)
一切都很好。
现在让我们说所有3个参数都是null
问题是(例如)在列 Name
包含null
的情况下。 (db列上没有值)
所以 - 产生类似这样的东西
and Name = isnull(@name,Name)
转换为
and Null = isnull(Null,Name)
转换为
and Null = Null
(因为列[Name]值为“null”)
这就是爆炸的地方。 (因为null!= null)
我不想使用set ansi null
解决方案。
还有其他优雅的解决方案吗?
嗯......我可以用这个
ISNULL(Name ,1) = ISNULL(@Name ,ISNULL(Name ,1))
但我不确定这是否是最佳解决方案......
答案 0 :(得分:1)
您可以将SQL查询更改为以下内容:
select * from....
where
...
and (Name = @name OR (@name IS NULL AND Name IS NULL))
and (Age = @Age OR (@Age IS NULL AND Age IS NULL))
and (Height = @Height OR (@Height IS NULL AND Height IS NULL))
答案 1 :(得分:1)
以
格式进行测试@var IS NULL or @var = Column
还有其他几个原因,为什么这是一个更好的格式,但我不记得他们在我的头顶。但是你的查询最终会看起来像这样。
select * from....
where
...
and (@name IS NULL OR @name = Name )
and (@age IS NULL OR @age = Age)
and (@height IS NULL OR @height = Height)