我想选择所有列值而不管NULL值为列值
我的问题是,当我尝试使用IS NULL选择值时我得到了这样的记录,这也是NULL值为:(
declare @status varchar(50)=NULL
declare @path varchar(50)= 'India'
select
*
from [vwMYDATA]
where
Path like '%' + @path + '%' and
(Status = @status or @status IS NULL)
vwMYDATA
path status
INDIA1 NULL
INDIA2 close
INDIA3 open
如果我执行上述查询,我将获得状态列具有NULL值的所有记录
预期是否未指定状态值显示所有状态记录
path status
INDIA1 NULL
INDIA2 close
INDIA3 open
显示
path status
INDIA1 NULL
我将这两个参数传递给具有此选择状态的存储过程。
如果状态未作为输入
,请帮我过滤并显示所有记录答案 0 :(得分:1)
select
*
from [vwMYDATA]
where
Path like '%' + @path + '%' and
((@status IS NULL )OR (Status = @status or status IS NULL))
答案 1 :(得分:0)
如果您希望根据@status varchar是否为NULL进行不同的操作,则需要将WHERE子句更改为Case语句。
Select *
From [vwMYDATA]
Where
Path Like Concat('%', @path, '%') And
1 = (
Case When @status Is Null Then 1
When Status = @status Then 1
Else 0
)
这可能是效率低下且不符合要求的。为了提高性能,最好有一个基于NULL匹配的完全不同的查询,以便可以应用正确的索引。
答案 2 :(得分:0)
如果您乐意总是过滤掉状态为空的记录(您似乎是这样),那么这应该有效:
declare @status varchar(50)=NULL
declare @path varchar(50)= 'India'
select
*
from [vwMYDATA]
where
Path like '%' + @path + '%' and
(Status = @status or @status IS NULL)
AND Status IS NOT NULL
答案 3 :(得分:0)
尝试删除or @status IS NULL
条件
select
*
from [vwMYDATA]
where
Path like '%' + @path + '%' and
(Status = @status)
答案 4 :(得分:0)
你需要改变你的状况,如下所示:
declare @status varchar(50)=NULL
declare @path varchar(50)= 'India'
select
*
from [vwMYDATA]
where
Path like '%' + @path + '%' and
(@status IS NULL OR Status = @status)
你只需要改变条件的位置,因为条件从第一个开始检查,所以现在如果@status为null,则查询不检查下一个条件。
答案 5 :(得分:0)
获取状态的NUll值记录 select * from vwMYDATA status is null
获取状态不是NUll值记录 select * from vwMYDATA status is not null