Как правильно применить фильтр для представленного запроса? - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть таблица как под

declare @t table(bucket bigint null)

insert into @t select 1 union all select 2 union all select -1 union all select 5

Теперь позвольте мне написать следующий запрос (фильтр по сегменту 0 - все значения поступают)

declare @Bucket bigint = 0 –filter by 0

select * from @t
where 1=1
AND (@Bucket is Null or @Bucket ='' or bucket=@Bucket)

Result
1
2
-1
5

Но если я отфильтрую Bucket по 2 или любому другому значению, я получу результаты правильно

declare @Bucket bigint = 2 –filter by 2
select * from @t
where 1=1
AND (@Bucket is Null or @Bucket ='' or bucket=@Bucket)

Result
2

Если я отфильтрую по нулю или пробелу, я получу правильный результат

declare @Bucket bigint = '' –filter by ''

select * from @t
where 1=1
AND (@Bucket is Null or @Bucket ='' or bucket=@Bucket)

Result
1
2
-1
5

Почему это поведение для корзины 0? И как решить?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

FIXED

declare @t table(bucket bigint);

INSERT INTO @t VALUES (1);
INSERT INTO @t VALUES (2);
INSERT INTO @t VALUES (-1);
INSERT INTO @t VALUES (5);
INSERT INTO @t VALUES (0);

declare @Bucket bigint = 0 --filter by 0

select * from @t
where 1=1
AND (@Bucket is Null or cast(@Bucket as nvarchar) = '' or bucket=@Bucket)
0 голосов
/ 02 ноября 2018

Вы можете попробовать использовать @Bucket bigint = NULL для @Bucket значения по умолчанию.

потому что NULL значит неизвестно

или вы можете установить значение, которое в столбце bucket не должно быть значением по умолчанию.

declare @Bucket bigint = NULL

select * 
from @t
where (@Bucket is Null or bucket = @Bucket)

Примечание

но если @Bucket bigint - это bigint, то оно не должно быть ''


Редактировать

CREATE TABLE T(
   Bucket bigint
);

declare @Bucket bigint = 0

INSERT INTO T VALUES (1);
INSERT INTO T VALUES (2);
INSERT INTO T VALUES (-1);
INSERT INTO T VALUES (5);
INSERT INTO T VALUES (0);


select * from T
where  (@Bucket is Null or (@Bucket ='' and @Bucket <> 0)  or bucket=@Bucket)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...