Разделение результирующего набора SQL SELECT в соответствии с условием WHERE - PullRequest
0 голосов
/ 05 января 2012

При таком запросе:

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

Я хочу, чтобы набор результатов каким-то образом "дифференцировал" результаты, которые встретили "условие1", с теми, которые встречали "условие2", и с теми, которые попали под "condition3 '.

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

Как это может бытьдостигнуто?

Спасибо.

Ответы [ 4 ]

7 голосов
/ 05 января 2012

Вы можете использовать для этого оператор 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)

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

0 голосов
/ 05 января 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
0 голосов
/ 05 января 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)
0 голосов
/ 05 января 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) 
...