2010-04-23 8 views
0

Итак, я пытаюсь выбрать количество строк из столбца, содержащего значение 3, но только если нет строк, содержащих 10 или 4, если есть строки, содержащие 10 или 4 I только хочу показать их.SQL select statement filtering

Что было бы хорошим синтаксисом для этого? Пока я пытаюсь выполнить инструкцию CASE WHEN, но я не могу понять, как это понять.

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

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

+0

Таким образом, в двух словах: «Если есть строки с 10 или 4, то выберите строки с 10 или 4, иначе выберите строки с 3"? – BalusC

+0

Вы хотите SUM() столбца «сумма»? Можете ли вы также дать нам несколько столбцов, которые будут основой?т.е.: столбец идентификатора для группировки (например, учетной записи или транзакции и т. д.), который вам нужно знать, если применимы 10 или 4 или нет. – DRapp

+0

дополнительно, если есть 10 или 4 записи ... вы хотите, чтобы эти суммы ИСКЛЮЧАЛИСЬ из такого суммирования в запросе? – DRapp

ответ

1

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

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)) 
+0

Это хорошая идея. Спасибо, я буду реализовывать это прямо сейчас. – cc0

+0

cudos to MrGumbe за то, что он смог определить, чего хочет OP! – Leslie

2

FYI: Orginal вопрос название было "SQL случай, когда 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 а (в данном примере) пустая строка.

+0

хороший ответ, но кто знал, что спрашивал OP ? –

+0

@KM: Да, это всегда основная проблема. ;-) Спасибо за голосование! – Tomalak

4

Используйте 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 
+0

Нам что-то не хватает ... Даже в вашем примере вы сравниваете один и тот же столбец для 10 или 4, если не 3. Таким образом, это будет означать несколько записей в таблице ... Если не существует другой базы, таблица может быть ЗАПОЛНЯЕТСЯ с 3s, 4s и 10s и всегда будет самоисключаемой в результате. Я думаю, что BalusC должен уточнить более подробно его фактическую структуру и базу образцов. – DRapp

+0

@DRapp: Я фактически сравниваю для '3', когда нет' 10' и нет '4'. Если его условие основано на подмножестве данных, было бы тривиально просто добавить это условие в предложения 'where' запросов. –

1

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

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

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

SELECT ... FROM YourTable WHERE SomeColumn = 3 

Запуск двух запросов может показаться «безвкусный», но она имеет преимущества:

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

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

+0

Вы делаете некоторые хорошие моменты, но я чувствую, что это будет немного неуклюжим решением в моем случае, поскольку база данных сопряжена с веб-сайтом – cc0