1

我想选择所有列值而不考虑 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  

我将这两个参数传递给具有此选择语句的存储过程。

如果状态未作为输入,请帮助我过滤并显示所有记录

4

6 回答 6

1
select 
*
from [vwMYDATA] 
where
Path like '%' + @path + '%' and
((@status IS NULL )OR (Status = @status or status IS NULL))
于 2013-09-16T12:36:10.723 回答
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,以便可以应用适当的索引。

于 2013-09-16T12:29:04.647 回答
0

如果您乐于始终过滤掉具有 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)
AND Status IS NOT NULL
于 2013-09-16T12:31:21.040 回答
0

只需尝试删除or @status IS NULL条件

select 
*
from [vwMYDATA] 
where
Path like '%' + @path + '%' and
(Status = @status)
于 2013-09-16T12:32:00.777 回答
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 将为空,则查询不检查下一个条件。

于 2013-09-16T12:35:50.187 回答
0

从状态为空的 vwMYDATA 中获取状态选择 * 的 NULL 值记录

Get Not NULL Value Records on Status select * from vwMYDATA where status is not null

于 2014-02-25T12:37:09.330 回答