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  

これらの 2 つのパラメーターを、この select ステートメントを持つストアド プロシージャに渡します。

ステータスが入力として指定されていない場合は、除外してすべてのレコードを表示するのを手伝ってください

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 が null になる場合、クエリは次の条件をチェックしません。

于 2013-09-16T12:35:50.187 に答える