Oracle SQL CASE с LIKE, возвращающим значение для обоих сценариев, когда я хочу получить результат, только если у них есть какой-либо из критериев - PullRequest
0 голосов
/ 23 октября 2018

У меня очень простой сценарий, я просто не могу приступить к работе.

У меня есть несколько примеров данных:

MyTable

IDNO IDCode
1    AAA
1    BBB
1    CCC
2    BBB
2    CCC
3    AAA

Текущий код

SELECT DISTINCT IDNO,
CASE WHEN IDCode IN ('BBB', 'CCC') THEN 1 ELSE 0 END yesno
FROM MyTable

Текущий вывод

IDNO    yesno
1       0
1       1
2       1
3       0

Я хочу вернуть 1, если какой-либо из критериев удовлетворен, даже если они содержат значение, которого нет в критериях CASE, но содержат по крайней мере1 из них.

Ожидаемый результат

IDNO    yesno
1       1
2       1
3       0

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Если у вас есть таблица idno уникально для каждой строки, вы можете сделать:

select i.idno,
       (case when exists (select 1 from t where t.idno = i.idnot and t.idcode in ('BBB', 'CCC' then 1 else 0 end)
             then 1 else 0
        end) as flag
from ids i;

Хотя условное агрегирование является хорошим решением, я упоминаю об этом, потому что:

  • У вас может быть idno с, которые вообще не имеют idcode с, и это включает их.
  • Exists часто работает лучше, чем агрегация.
  • Это может лучше соответствоватьсложный запрос, в котором вы объединяете множество атрибутов на уровне idno.
0 голосов
/ 23 октября 2018

Попробуйте использовать групповую и максимальную агрегацию ниже

DEMO

SELECT IDNO,
max(CASE WHEN IDCode IN ('BBB', 'CCC') THEN 1 ELSE 0 END) yesno
FROM MyTable
group by IDNO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...