Разделение набора результатов SQL SELECT в соответствии с условием WHERE

С таким запросом:

SELECT userID FROM Users
WHERE (condition1)
OR    (condition2)
OR    (condition3)

Я хочу, чтобы набор результатов каким-то образом «дифференцировал» результаты, соответствующие «условию 1», с теми, которые соответствуют «условию 2», и с теми, которые подпадают под «условие 3».

Например, каким-то образом заставить результирующий набор иметь второй столбец, который будет содержать, какое условие было выполнено (1,2 или 3).

Как этого добиться?

Спасибо.


person Yuval A.    schedule 04.01.2012    source источник
comment
Это проблема алгоритма, а не проблема sql. Переосмыслите свое приложение.   -  person Leandro Bardelli    schedule 05.01.2012
comment
@Leandro, я не очень понимаю ваш комментарий, я спросил, как достичь определенной цели с помощью SQL-запроса, как актуален тип проблемы?   -  person Yuval A.    schedule 05.01.2012
comment
@ЮвалА. - Потому что либо вы выполняете несвязанные операторы (фактически) в этом SQL, и/или вы не включаете достаточную информацию для приложения, чтобы сделать различие, вот где это важно. Вы применяете фильтрацию в базе данных, которую вместо этого следует применять на прикладном уровне. В настоящее время вы должны поддерживать синхронизацию SQL и приложения (условия должны совпадать): если вы предоставили достаточно информации для приложения, чтобы выполнить собственную фильтрацию, они становятся независимыми.   -  person Clockwork-Muse    schedule 05.01.2012
comment
@Leandro Я согласен с тем, что в более практической реализации информация об определенных условиях - если это необходимо приложению - уже должна быть доступна в отдельном столбце, и что результаты фильтрации внутри SELECT не должны быть источником информации . Суть в том, что вопрос был о том, как улучшить запрос статистики. Ваш комментарий заставил меня задуматься о чем-то еще, связанном с этим... :)   -  person Yuval A.    schedule 05.01.2012


Ответы (4)


Для этого вы можете использовать оператор CASE, например:

SELECT userID,
    case 
        when (condition1) then 1
        when (condition2) then 2
        when (condition3) then 3
    end as ConditionMet
 FROM Users
    WHERE (condition1)
    OR    (condition2)
    OR    (condition3)

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

person D'Arcy Rittich    schedule 04.01.2012

Конкретный синтаксис для предложения IF зависит от СУБД, но что-то вроде этого должно работать:

select userid,
(if (condition1) THEN 1 else 0) as COndition1, 
(if (condition2) THEN 1 else 0) as COndition2, 
(if (condition3) THEN 1 else 0) as COndition3
FROM table
WHERE (condition1) or (condition2) or (condition3) 
person Elroy Flynn    schedule 04.01.2012

Используйте те же условия, указанные в предложении where, чтобы добавить дополнительный столбец, указывающий, какой из них соответствует. Например:

SELECT userID ,
case when condition1 then 'condition1'  
when condition2 then 'condition2'
else 'condition3' end as matched
FROM Users
WHERE (condition1)
OR    (condition2)
OR    (condition3)
person Icarus    schedule 04.01.2012

Если условия не пересекаются (т.е. исключают друг друга), то можно сделать так:

SELECT userID, 'condition1'
  FROM Users
  WHERE (condition1)
UNION ALL
SELECT userID, 'condition2'
  FROM Users
  WHERE (condition2)
UNION ALL
SELECT userID, 'condition3'
  FROM Users
  WHERE (condition3)
ORDER BY userID

Однако вы получите дубликаты, если пользователь соответствует более чем одному условию. В некоторых случаях это может быть полезно, но если вам нужно исключить дубликаты, вы можете сделать это:

SELECT userID, 'condition1'
  FROM Users
  WHERE (condition1)
UNION ALL
SELECT userID, 'condition2'
  FROM Users
  WHERE (condition2) AND NOT (condition1)
UNION ALL
SELECT userID, 'condition3'
  FROM Users
  WHERE (condition3) AND NOT (condition2) AND NOT (condition1)
ORDER BY userID
person Neil    schedule 04.01.2012