sql query - true => true, false => true или false - PullRequest
4 голосов
/ 26 июня 2009

Простой запрос, возможно, невозможный, но я знаю, что есть умные люди:)

Учитывая логический параметр, я хочу определить мое предложение where, чтобы либо ограничить вывод определенного столбца, либо ничего не делать.

Итак, при заданном параметре @bit = 1 это будет результат:

где столбец = 1

данный параметр @bit = 0 это будет результат:

где столбец = 1 или 0

т.е. не влияет / показать все результаты (столбец - битовое поле)

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

Есть? Я использую SQL Server.

ура: D

Ответы [ 8 ]

7 голосов
/ 26 июня 2009

Ответ column = 1 or @bit = 0 работает, если столбец может быть только 0 или 1. Если столбец может иметь любое желаемое значение: column = 1 or @bit = 0 and column = 0.

4 голосов
/ 26 июня 2009
SELECT  *
FROM    mytable
WHERE   column = 1 OR @bit = 0

Если у вас есть индекс на column1, он будет более эффективным:

SELECT  *
FROM    mytable
WHERE   column = 1 AND @bit = 1
UNION ALL
SELECT  *
FROM    mytable
WHERE   @bit = 0

См. Эту статью в моем блоге для сравнения производительности одного условия WHERE с UNION ALL:

3 голосов
/ 26 июня 2009
where column BETWEEN @bit AND 1
0 голосов
/ 26 июня 2009

ГДЕ столбец> = @ бит

Однако это работает только для> 0 значений в числовом столбце. @bit будет неявно приведен к int, smallint и т. д. из-за приоритета типа данных.

0 голосов
/ 26 июня 2009

попробуйте

 select ...
 from table
 where column = case when @bit = 0 then 0 else column end

это работает независимо от типа данных столбца (например, может быть даже строкой). Если бы это было, конечно, это было бы другое значение по умолчанию (не 0)

0 голосов
/ 26 июня 2009

Я придумал другой ответ и почувствовал себя глупым, увидев консенсусный ответ. Так что, просто ради, сравнил два, используя мою базу данных. Я действительно не знаю, действительно ли они сопоставимы, но мои планы выполнения дают небольшое преимущество моему глупому ответу:

выберите *
из MyTable
где столбец <> case @bit, когда 1, затем 0, иначе -1 end

Я понимаю, что индексы, размер таблицы и т. Д. Могут повлиять на это.
Кроме того, понял, что вы, вероятно, не можете сравнить с -1 ...
Просто думал, что поделюсь.

0 голосов
/ 26 июня 2009
select ...
from [table]
where @bit = 0 or (column = @bit)
0 голосов
/ 26 июня 2009
select *
from   MyTable
where (@bit = 0 OR MyColumn = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...