SQL: Где MYID = ANY?

#sql #sql-server-2005

#sql #sql-server-2005

Вопрос:

В SQL-запросе, который содержит

 ... WHERE MYID = @1 ....
  

Я должен управлять 2 случаями
1) В столбце есть фильтр, @1 будет числом (1,2, X …)

2) В этом столбце нет фильтра, @1 будет …? (ЛЮБОЙ)

Есть ли что-нибудь для этого «any» (SQL Server 2005)?

PS.
Очевидно, я понимаю, что я могу удалить «где».

PPS.
Я поясняю для лучшего понимания: у меня есть этот запрос в коде, и я хотел бы передать целое число в качестве параметра, когда фильтр включен, и «что-то», когда мой фильтр выключен.

 if (filterOn)
    GetFoos(fooID);
else
    GetFoos("ANY");

GetFoos(param1): "select * from FOOS where FOOID = {0}", param1
  

Комментарии:

1. Почему бы вам просто не выполнить 2 разделяющих запроса вместо этого. Выберите один на основе значения @1.

Ответ №1:

Сделайте UNION ALL из двух инструкций:

 SELECT  *
FROM    mytable
WHERE   myid = @col
UNION ALL
SELECT  *
FROM    mytable
WHERE   @col IS NULL
  

или просто разделите их в IF / ELSE блоке хранимых процедур.

В любом случае оптимизатор сможет оптимизировать запросы по отдельности, полностью игнорируя один из них в зависимости от значения @col .

Комментарии:

1. @serhio: просто передайте NULL вместо 'ANY' .

Ответ №2:

вы могли бы сделать что-нибудь в этом роде:

  where (myid = @id or @id is null)
  

таким образом, вы будете фильтровать только тогда, когда @id содержит значение, а не тогда, когда оно есть null .

Комментарии:

1. Выполнение этого наказывает за случай, когда есть конкретное @id значение для поиска, как описано здесь sommarskog.se/dyn-search-2005.html

2. @serhio: столбец ID не должен быть нулевым, но параметр может быть таким, чтобы сигнализировать, что вы действительно не хотите фильтровать по нему. Или вы могли бы использовать значение 0 для обозначения «не фильтровать».

3. Хорошо, я понял, в чем дело. Теперь представьте, что это не процедура, а строка SQL, подобная select * from FOOS where FOOID = {0}

Ответ №3:

Просто удалите предложение where или and, если в этом столбце нет фильтра.

Ответ №4:

Если вы не хотите фильтровать по определенному столбцу, просто не выполняйте фильтрацию по этому столбцу. Удалите WHERE MYID = полностью

Комментарии:

1. У меня есть строковый запрос. Есть ли возможность оставить все как есть, но просто заменить что-то вместо «any»?

2. Если вы используете LIKE вместо = , то, я думаю, вы можете использовать WHERE MYID LIKE % для сопоставления с чем угодно. РЕДАКТИРОВАТЬ: И WHERE MYID LIKE 42 по-прежнему будет соответствовать только 42.

3. @serhio: где вы выполняете этот запрос? Какой-то язык программирования или хранимая процедура?

4. Почему вы не можете изменить запрос?

5. @serhio: LIKE 4 не соответствует 42

Ответ №5:

Имея

 "select * from FOO where FOOID = {0}", param
  

используйте param=»FOOID», когда нет параметра для фильтрации, это даст

 select * from FOO where FOOID = FOOID // removing the filter