Возвращать одно значение при проверке значений строк таблицы - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь вернуть одно значение из таблицы с большим количеством строк, если выполняется условие.Например, у меня есть таблица (ID (pk), CODE (pk), DESCRIPTION), в которой много строк.Как я могу вернуться в одну строку, если ..

SELECT CASE
    WHEN CODE IN ('1', '2') THEN '100'
    WHEN CODE IN ('2', '3') THEN '200'
    WHEN CODE IN ('5', '7') THEN '300'
END AS ASDASD
FROM TABLE
WHERE ID = 1;

Проблема в том, что КОД должен проверять оба, а не только один из них.Код, как он есть, вернется, если, например, этот идентификатор получил код «2».

ASDASD
NULL
'200'

И я хочу вернуть только '200', потому что этот идентификатор имеет код '2' и '3'.

Ответы [ 3 ]

0 голосов
/ 09 февраля 2019

Предполагая, что коды не дублируются для конкретного id:

SELECT ID,
       (CASE WHEN SUM(CASE WHEN CODE IN ('1', '2') THEN 1 ELSE 0 END) = 2
             THEN '100'
             WHEN SUM(CASE WHEN CODE IN ('2', '3') THEN 1 ELSE 0 END) = 2
             THEN '200'
             WHEN SUM(CASE WHEN CODE IN ('5', '7') THEN 1 ELSE 0 END) = 2
             THEN '300'
     END) AS ASDASD
FROM TABLE
WHERE ID = 1
GROUP BY ID;

Я добавил ID к SELECT только потому, что это может быть полезно для нескольких идентификаторов.

0 голосов
/ 09 февраля 2019

Вам необходимо проверить число, возвращаемое запросом, например:

SELECT COUNT(DISTINCT CODE) FROM TABLE WHERE ID = 1 AND CODE IN ('1', '2')

Если это число 2, то ID = 1 имеет оба значения CODE '1' и '2'.

SELECT 
  CASE
    WHEN (SELECT COUNT(DISTINCT CODE) FROM TABLE WHERE ID = 1 AND CODE IN ('1', '2')) = 2 THEN '100'  
    WHEN (SELECT COUNT(DISTINCT CODE) FROM TABLE WHERE ID = 1 AND CODE IN ('2', '3')) = 2 THEN '200'
    WHEN (SELECT COUNT(DISTINCT CODE) FROM TABLE WHERE ID = 1 AND CODE IN ('5', '7')) = 2 THEN '300'
  END AS ASDASD
FROM TABLE
0 голосов
/ 09 февраля 2019

Вы можете попробовать использовать агрегацию условий следующим образом:

SELECT CASE
    WHEN MAX(DECODE(code, '1', 1)) = 1 AND MAX(DECODE(code, '2', 1)) = 1 
        THEN '100'
    WHEN MAX(DECODE(code, '2', 1)) = 1 AND MAX(DECODE(code, '3', 1)) = 1 
        THEN '200'
    WHEN MAX(DECODE(code, '5', 1)) = 1 AND MAX(DECODE(code, '7', 1)) = 1 
        THEN '300'
END AS asdasd
FROM TABLE
WHERE ID = 1;

DECODE() - удобная функция Oracle, которая сравнивает выражение (code) с сериейзначения и возвращает результаты соответственно.По сути, условие MAX(DECODE(code, '1', 1)) = 1 гарантирует, что хотя бы в одной строке есть code = '1'.

PS: вы действительно храните числа в виде строк?Если code - это тип данных числа, удалите одинарные кавычки в приведенном выше запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...