Как отфильтровать записи по всем строкам? - PullRequest
0 голосов
/ 16 апреля 2011

Я разрабатываю запрос SQL для извлечения всех записей из данной таблицы. Но хитрость здесь в том, что эта логика основана на числовом поле базы данных. Итак, есть 4 варианта: 0,1,2,3. Если пользователь выбирает 0,1 или 2, тогда мой запрос возвращает строки с указанным значением. Но если они выбирают 3, он должен вернуть все строки. Как мне сделать это в SQL? Я знаю, если бы это была строка, я мог бы сделать что-то вроде: WHERE = CASE WHEN = 3 THEN '%' ELSE END

Но в данном случае это целое число. Звучит относительно просто, но я получаю ошибки.

Ответы [ 3 ]

3 голосов
/ 16 апреля 2011

Попробуйте:

SELECT *
  FROM <YOUR_TABLE>
 WHERE
 (
  <YOUR_COLUMN> = @InputValue OR
  3 = @InputValue
 )

Где @InputValue - имя параметра, отправляемого в запрос.

2 голосов
/ 16 апреля 2011

Самый простой способ сделать это:

select MyColumn
from   MyTable
where  ( MyValue = @MyParameter or @MyParameter = 3)

Если вас интересует лучшая оптимизация, вы можете сделать это, но она менее удобна для обслуживания:

if (@MyParameter = 3)
    select MyColumn
    from MyTable
else
    select MyColumn
    from MyTable
    where MyValue = @MyParameter

Если бы я был вынужден реализовать эту функцию, то, вероятно, я бы сделал это, просто чтобы прояснить ситуацию:

declare @AllRecords nchar(1)
if (@MyParameter = 3)
   set @AllRecords = N'Y'
else
   set @AllRecords = N'N'

select MyColumn
from MyTable
where (MyValue = @MyParameter or @AllRecords = N'Y')

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

ОБНОВЛЕНО

Вот версия, которая должна работать с вашими расширенными требованиями (я думаю, что для этого требуется одна из более новых версий SQL Server):

declare @SelectedLevels table (LevelId int not null primary key)
if @LevelId = 3
    insert into @SelectedLevels (LevelId) values (1), (2)
else if @LevelId = 5
    insert into @SelectedLevels (LevelId) values (0), (1), (2)
else
    insert into @SelectedLevels (LevelId) values (@LevelId)

select mt.MyColumn
from   MyTable mt
       inner join @SelectedLevels sl on sl.LevelId = MyTable.LevelId
1 голос
/ 16 апреля 2011
if @Param = 3
begin
  select *
  from @T
end
else
if @Param = 2
begin
  select *
  from @T
  where id in (0,1)
end
else
begin
  select *
  from @T
  where id = @Param
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...