select case с подзапросом возвращает несколько строк в select - PullRequest
1 голос
/ 04 октября 2019

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

Цель состоит в том, чтобы позволить функции вернуться0 или 1 в зависимости от определенного условия.

SELECT CASE WHEN my_count <= 1 AND stat = "START" THEN 0
            WHEN my_count > 1 AND stat IN ("START", "RUN", "ERR") THEN 1
            ELSE -1
       END AS
INTO return_val
FROM (select
     (SELECT count(DISTINCT(stat) FROM my_table
     WHERE my_table.HIVE = "hive1"
     AND EXTRACT(MONTH FROM PARTITION_DATE) = EXTRACT(MONTH FROM TO_DATE("20190605", 'YYYY-MM-DD'))
       AND EXTRACT(YEAR FROM PARTITION_DATE) = EXTRACT(YEAR FROM TO_DATE("20190605", 'YYYY-MM-DD'))
   ) status_count,
     (SELECT DISTINCT(status) AS status_ FROM my_table
     WHERE EL_F_BDP_PROC_REALTIME.HIVE = "hive1"
     AND EXTRACT(MONTH FROM PARTITION_DATE) = EXTRACT(MONTH FROM TO_DATE("20190605", 'YYYY-MM-DD'))
       AND EXTRACT(YEAR FROM PARTITION_DATE) = EXTRACT(YEAR FROM TO_DATE("20190605", 'YYYY-MM-DD'))
   )status_
     FROM dual
       )x    ;
      RETURN(return_val);
END;

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

У вас есть несколько состояний в операторе:

(SELECT DISTINCT(status) AS status_ FROM my_table 
          WHERE EL_F_BDP_PROC_REALTIME.HIVE = 'hive1' 
          AND EXTRACT(MONTH FROM PARTITION_DATE) = EXTRACT(MONTH FROM TO_DATE('20191212', 'YYYY-MM-DD'))
          AND EXTRACT(YEAR FROM PARTITION_DATE) = EXTRACT(YEAR FROM TO_DATE('20191212', 'YYYY-MM-DD'))
        )

и возвращено более одной строки.

Для выполнения Rigth вам необходимо вернуть один пример значения:

max((SELECT DISTINCT(status) AS status_ FROM my_table 
              WHERE EL_F_BDP_PROC_REALTIME.HIVE = 'hive1' 
              AND EXTRACT(MONTH FROM PARTITION_DATE) = EXTRACT(MONTH FROM TO_DATE('20191212', 'YYYY-MM-DD'))
              AND EXTRACT(YEAR FROM PARTITION_DATE) = EXTRACT(YEAR FROM TO_DATE('20191212', 'YYYY-MM-DD'))
            ))

Это выполняется, но, возможно, логика неверна

Попробуйте:

with tbl as (
select 'START' status,     'hive1' str, to_date('2019-12-11', 'yyyy-mm-dd') dt from dual 
union all
select 'NA' status,     'hive1' str, to_date('2019-12-11', 'yyyy-mm-dd') from dual 
union all
select 'END' status,     'hive1' str, to_date('2019-12-11', 'yyyy-mm-dd') from dual)
select dt, str, listagg(status, ' ') WITHIN GROUP (ORDER BY str) 
from tbl
GROUP BY dt, str
0 голосов
/ 04 октября 2019

Прежде всего ваш запрос имеет несколько синтаксических проблем. Вам необходимо:

  • изменить двойные кавычки на одинарные
  • исправить формат даты (20190605 не совместим с YYYY-MM-DD)
  • после count(DISTINCT(stat)
  • пропущены круглые скобки, если после выражения case when .. then следует as, за которым as должен следовать (действительный) псевдоним

  • Полагаю, my_count означает status_count в выражении case..when

  • Псевдоним status_ в DISTINCT(status) AS status_ является избыточным и не имеет смысла

Итак, рассмотрим следующую инструкцию SELECT:

SELECT CASE
         WHEN status_count <= 1 AND status_ = 'START' THEN
          0
         WHEN status_count > 1 AND status_ IN ('START', 'RUN', 'ERR') THEN
          1
         ELSE
          -1
       END 
  INTO :return_val
  FROM (SELECT (SELECT COUNT(DISTINCT stat)
                  FROM my_table
                 WHERE my_table.HIVE = 'hive1'
                   AND EXTRACT(MONTH FROM PARTITION_DATE) =
                       EXTRACT(MONTH FROM DATE'2019-06-05')
                   AND EXTRACT(YEAR FROM PARTITION_DATE) =
                       EXTRACT(YEAR FROM DATE'2019-06-05')) status_count,
               (SELECT MAX(DISTINCT status)
                  FROM my_table
                 WHERE EL_F_BDP_PROC_REALTIME.HIVE = 'hive1'
                   AND EXTRACT(MONTH FROM PARTITION_DATE) =
                       EXTRACT(MONTH FROM DATE'2019-06-05')
                   AND EXTRACT(YEAR FROM PARTITION_DATE) =
                       EXTRACT(YEAR FROM DATE'2019-06-05')) status_
          FROM dual);

Ваша проблема, связанная с возвратом более одной строки, может быть связана с частью DISTINCT(status) AS status_, где вы можете использовать агрегацию, например MIN или MAX для возврата ровно одной строки в этом подзапросе путем преобразования в MAX(DISTINCT status)

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