Фильтрация операторов выбора SQL - PullRequest
0 голосов
/ 23 апреля 2010

Хорошо, поэтому я пытаюсь выбрать количество строк в столбце, который содержит значение 3, но только если нет строк, содержащих 10 или 4, если есть строки, содержащие 10 или 4, я хочу показать только те.

Какой будет хороший синтаксис для этого? До сих пор я пытался сделать утверждение CASE WHEN, но я не могу понять это.

Любая помощь будет принята с благодарностью.

(Моя база данных находится на сервере MS SQL 2008)

Ответы [ 4 ]

4 голосов
/ 23 апреля 2010

Используйте union all:

select
    // columns
from YourTable
where YourColumn = 3 and not exists (
    select 1 from YourTable where YourColumn = 10 or YourColumn = 4)

union all

select
    // columns
from YourTable
where YourColumn = 10 or YourColumn = 4
2 голосов
/ 23 апреля 2010

К вашему сведению : заголовок оригинального вопроса был " SQL CASE WHEN NULL - вопрос "


CASE WHEN YourColumn IS NULL THEN x ELSE y END

Поскольку ничто не сравнится с NULL и вернет true (даже сам NULL), вы не можете сделать

CASE YourColumn WHEN NULL THEN x ELSE y END

только

CASE ISNULL(YourColumn, '') WHEN '' THEN x ELSE y END

но тогда вы потеряете способность различать NULL и (в этом примере) пустую строку.

1 голос
/ 23 апреля 2010

Самое простое решение - сделать это в двух запросах:

SELECT ... FROM YourTable WHERE SomeColumn IN (10,4)

Если и только если вышеуказанный запрос не даст результатов, запустите второй запрос:

SELECT ... FROM YourTable WHERE SomeColumn = 3

Выполнение двух запросов может показаться «не элегантным», но имеет свои преимущества:

  • Легко кодировать
  • Легко отлаживать
  • Часто имеет лучшую производительность, чем очень сложное решение
  • Это легко понять программисту, который должен поддерживать код после вас.

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

1 голос
/ 23 апреля 2010

В зависимости от размера вашей таблицы и ее индексов может быть более эффективно вычислить, какие значения вы хотите перед запросом

declare @UseThree as bit = 1;
if exists (select 1 from testtable where rowval in (10,4))
set @UseThree = 0;

select COUNT(*) 
from testtable
where (@UseThree = 1 AND rowval=3)
    OR
    (@UseThree = 0 AND rowval in (10,4))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...