2008-12-08 4 views
2

У меня есть этот код:SQL постановка задачи

Проблема в том, мне нужно передать одно значение? и получить весь результат без фильтра, что-то вроде *

Любая помощь?

+0

Как это «C#»? – 2008-12-08 13:37:33

ответ

1

Типичный способ сделать это что-то вроде:

WHERE (? IS NULL OR starttime >= ?) 

, а затем пройти в DBNull.Value. Очевидно, вам нужно сделать это для каждого параметра, который вы хотите, чтобы иметь «подстановочный знак», подобный этому.

+0

Damnit. Но я получил КОД! – Will 2008-12-08 13:04:18

+0

Это довольно хорошо, но «ИЛИ» может помешать индексированию столбца. Это, конечно, зависит от конкретной СУБД. – 2008-12-08 13:06:16

7
WHERE 
    (@start is null OR starttime >= @start) AND 
    (@end is null OR endtime <= @end) AND 
    (@fromOutside is null OR is_fromoutside = @fromOutside) AND 
    (@fromNo is null OR from_no = @fromNo) AND 
    (@toNo is null OR to_no = @toNo) 

Передача нулей для всех параметров (dang sql nulls; thanks GC).

1

Добавить «где» заявление условно - только если вам нужно отфильтровать результаты

2

Для сложных запросов с множеством дополнительных разделов, вы можете обнаружить, что лучше создать SQL, чтобы удовлетворить. Вы можете сделать это либо у вызывающего (например, на C#), либо в базе данных (по крайней мере, с SQL Server), но в любом случае вы должны должны убедиться, что он остался параметризованным. Когда вызывающий абонент выполняет работу, это всего лишь случай добавления подходящих параметров в команду. Если db генерирует TSQL, то подход зависит от СУБД. С помощью SQL-сервера, sp_ExecuteSql ваш друг - то есть вы можете построить @cmd переменную на основе запроса, а затем:

EXEC sp_ExecuteSQL @cmd, N'@someArg int', @actualArg 

Где @someArg это объявление в @cmd и @actualArg это значение, которое пройдет в во время выполнения ,

3

Мне нравится COALESCE.

Вы должны быть осторожны с нулевыми значениями в левой части, если в левой части могут быть нули, вы можете сделать что-то вроде последней строки, чтобы совпадения совпадали. Как правило, с чем-то вроде этого, хотя вы захотите убедиться, что ваш запрос все еще работает нормально.

SELECT idcallhistory3, callid, starttime, answertime, endtime, duration, 
      is_answ, is_fail, is_compl, is_fromoutside, mediatype, from_no, 
      to_no, callerid, dialednumber, lastcallerid, lastdialednumber, 
      group_no, line_no 
FROM  "public".callhistory3 
WHERE  (starttime >= COALESCE(@starttime, starttime)) 
      AND (endtime <= COALESCE(@endtime, endtime)) 
      AND (is_fromoutside = COALESCE(@is_fromoutside, is_fromoutside)) 
      AND (from_no = COALESCE(@from_no, from_no)) 
      AND (COALESCE(to_no, -1) = COALESCE(@to_no, to_no, -1)) -- make nulls match 
0

Я согласен с Jamal Hansen. COALESCE - это, безусловно, лучший способ, по крайней мере, на SQL Server

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

  • Нет связанных вопросов^_^