У меня есть этот код:SQL постановка задачи
Проблема в том, мне нужно передать одно значение? и получить весь результат без фильтра, что-то вроде *
Любая помощь?
У меня есть этот код:SQL постановка задачи
Проблема в том, мне нужно передать одно значение? и получить весь результат без фильтра, что-то вроде *
Любая помощь?
Типичный способ сделать это что-то вроде:
WHERE (? IS NULL OR starttime >= ?)
, а затем пройти в DBNull.Value. Очевидно, вам нужно сделать это для каждого параметра, который вы хотите, чтобы иметь «подстановочный знак», подобный этому.
Damnit. Но я получил КОД! – Will 2008-12-08 13:04:18
Это довольно хорошо, но «ИЛИ» может помешать индексированию столбца. Это, конечно, зависит от конкретной СУБД. – 2008-12-08 13:06:16
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).
Добавить «где» заявление условно - только если вам нужно отфильтровать результаты
Для сложных запросов с множеством дополнительных разделов, вы можете обнаружить, что лучше создать SQL, чтобы удовлетворить. Вы можете сделать это либо у вызывающего (например, на C#), либо в базе данных (по крайней мере, с SQL Server), но в любом случае вы должны должны убедиться, что он остался параметризованным. Когда вызывающий абонент выполняет работу, это всего лишь случай добавления подходящих параметров в команду. Если db генерирует TSQL, то подход зависит от СУБД. С помощью SQL-сервера, sp_ExecuteSql
ваш друг - то есть вы можете построить @cmd
переменную на основе запроса, а затем:
EXEC sp_ExecuteSQL @cmd, N'@someArg int', @actualArg
Где @someArg
это объявление в @cmd
и @actualArg
это значение, которое пройдет в во время выполнения ,
Мне нравится 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
Я согласен с Jamal Hansen. COALESCE - это, безусловно, лучший способ, по крайней мере, на SQL Server
Как это «C#»? – 2008-12-08 13:37:33