Оператор CASE для переключения условий WHERE - PullRequest
1 голос
/ 15 июля 2010

Я бы хотел иметь оператор t-sql, подобный следующему ...

SELECT [field]
FROM [table]
WHERE CASE @flag
        WHEN 1 THEN col1 = @value
        ELSE col2 = @different_value
      END

Суть в том, что я хочу поставить флаг в своей функции, чтобы использовать разные выражения where в одном запросе.Я просто не могу заставить его работать.Возможно ли это?

Ответы [ 5 ]

4 голосов
/ 15 июля 2010

Будет ли это работать для вас?

Where (@flag = 1 and col1 = @value) or (@flag != 1 and col2 = @different_value). 
1 голос
/ 15 июля 2010

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

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

Условия динамического поиска в T-SQL. Автор Erland Sommarskog

Проклятие и благословения динамического SQL Эрланда Соммарского

это даст лучший план выполнения:

IF @flag=1
BEGIN
    SELECT
        [field]
        FROM [table]
        WHERE col1 = @value
END
ELSE
BEGIN
    SELECT
        [field]
        FROM [table]
        WHERE col2 = @different_value
END

Однако, если вам нужен один запрос, лучше всего использовать индекс

.
SELECT
    [field]
    FROM [table]
    WHERE @flag=1
        AND col1 = @value
UNION ALL
SELECT
    [field]
    FROM [table]
    WHERE @flag!=1
        AND col2 = @different_value
1 голос
/ 15 июля 2010

С mySQL ваш оператор должен работать, потому что mySQL поддерживает бинарные выражения.

Итак, вы должны попробовать это

SELECT [field] 
FROM [table] 
WHERE CASE @flag 
        WHEN 1 
        THEN case when col1 = @value then 1 else 0 end
        ELSE case when col2 = @different_value then 1 else 0 end 
      END = 1

Это не очень хорошо читается. Пожалуйста, помните о проблемах с производительностью, потому что здесь может возникнуть проблема с оптимизатором.

0 голосов
/ 15 июля 2010

Как насчет просто;

WHERE
  (@flag = 1 AND col1 = @value)
OR
  (@flag = 2 AND col2 = @different_value)
...
0 голосов
/ 15 июля 2010

Вы также можете использовать логическую логику:

SELECT blah FROM myTable WHERE (@i IS NULL OR AnotherCondition)
...