2010-09-08 2 views
1
select * from table where [email protected] 

Я не уверен, насколько это легко, но я не мог опустить голову. Я хочу, чтобы иметь возможность изменять предложение where по вышеуказанному запросу, так что если вместо 0-3-3 или 4 в качестве 0 использовать значение 0, то он будет выбирать все категории. У меня нет категории с 0 в базе данных.sql server условное, где

ответ

2

Вы можете установить его в NULL, если вы хотите, чтобы выбрать все категории просто модифицируют выбрать как этот

select * from table where category= ISNULL(@categoryid, category) 
+0

Не совсем ответит на вопрос, но он чист чем подход Мэтта Гибсона, но требует нескольких модификаций на стороне клиента. –

-2

Это SQL не PL/SQL. Вам нужно проверить значение перед отправкой запроса, который вы не можете запросить SQL, для его проверки.

+2

Я остановил вас, потому что не мог понять ваши аргументы. –

+0

Достаточно справедливо, похоже, я на этот раз заговорил над моей головой: D – MaxouMask

3

Это, вероятно, следует разделить на 2 отдельные запросы, если вы на самом деле не хотите того же план выполнения полного кластерного индекса сканирования, которые будут использоваться как в случае, @categoryid=0 и @categoryid<>0

Разделив на 2 отдельные запросы вы будете потенциально разрешить те, в которых @categoryid не равен нулю, чтобы удовлетворять поиску индекса, а не полному сканированию.

Если таблица небольшая или @categoryid не очень избирательно, это может быть не проблема.

1
select * from table where 
category BETWEEN @mincategoryid AND @maxcategoryid 

Мин и макс будет одним из

  • оба 1 (или 2 или 3 или 4)
  • соответственно 0 и большое число

Это будет используйте индекс тоже ..

+0

+1 Мне нравится это решение. –

+0

не будет работать, если значение столбца равно нулю. –

+0

@KM: звучит как столбцы с недействительными значениями, хотя – gbn

Смежные вопросы