условное предложение WHERE в TSQL, проблема операторов - PullRequest
0 голосов
/ 11 апреля 2011

В запросе SQL Server я хотел бы иметь условное предложение WHERE, например:

WHERE id_A = CASE WHEN @id != 0 THEN @id ELSE anything but @id END

Я не знаю, как написать часть ELSE.В одном случае мне нужно иметь WHERE id_A = @id, но WHERE id_A != @id для ELSE.

Спасибо за вашу помощь.

Ответы [ 3 ]

3 голосов
/ 11 апреля 2011

Попробуйте что-то вроде этого:

WHERE (@id != 0 AND id_A = @id) OR (@id = 0 AND id_A != @id)

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

IF @id != 0 THEN
BEGIN
    SELECT /* columns from table */
    WHERE id_A = @id
END
ELSE
BEGIN
    SELECT /* columns from table */
    WHERE id_A != 0
END

К сожалению, это означает дублирование остальной части вашего запроса SQL, однако, вероятно, он будет работать лучше в случае, когда один вариант возвращает большую частьТаблица однако первый вариант возвращает только одну строку.

1 голос
/ 11 апреля 2011
--will match always (if id_A can not be NULL
WHERE
    id_A = CASE WHEN @id <> 0 THEN @id ELSE id_A END

-- will be false always
WHERE
    id_A = CASE WHEN @id <> 0 THEN @id ELSE NULL END

Их можно записать как

 WHERE
    id_A = ISNULL(NULLIF(@id, 0), id_A)

 WHERE
    id_A = NULLIF(@id, 0)
1 голос
/ 11 апреля 2011

Предполагается, что id_a не может обнуляться

WHERE  id_a = CASE
                WHEN @id = 0 THEN CASE
                                    WHEN id_a <> 0 THEN id_a
                                  END
                ELSE @id
              END 

Должен это сделать.Если вы не используете OPTION RECOMPILE и в определенных версиях SQL Server 2008 , это будет неэффективным.

...