#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.html2. @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