Oracle - отображать «без строк», когда запрос не возвращает результатов - PullRequest
0 голосов
/ 01 апреля 2020

Мне бы хотелось, чтобы в выводе Oracle SQL отображалось сообщение "Строки не найдены", когда запрос не дал результатов.

Я пытаюсь использовать функцию NVL, но я получаю сообщение об ошибке

'ОШИБКА в строке 21: ORA-00907: отсутствует правая скобка'

SELECT NVL((
            SELECT TO_CHAR(CHGDATE, 'yyyy-mm')
                ,CHGFIELD
                ,DBNAME
                ,COUNT(*)
            FROM APPCHANGEHIST A
                ,DATABASEFIELD D
            WHERE A.CHGFIELD = D.FIELDNUM
                AND trunc(CHGDATE) BETWEEN add_months(to_date(to_char((sysdate - to_char(sysdate, 'dd') + 1), 'dd-mon-yyyy')), - 1)
                    AND to_date(to_char((sysdate - to_char(sysdate, 'dd')), 'dd-mon-yyyy'))
                AND CHGFIELD = 79
                AND OLDVALUE IS NOT NULL
                AND EXISTS (
                    SELECT 1
                    FROM USERPROF
                    WHERE USERID = A.CHGREQUESTOR
                    )
            GROUP BY TO_CHAR(CHGDATE, 'yyyy-mm')
                ,CHGFIELD
                ,DBNAME
            ORDER BY 1
                ,4 DESC
            ), "No Rows");

У меня нет проблем, когда я запускаю это утверждение без NVL

SELECT TO_CHAR(CHGDATE, 'yyyy-mm')
                ,CHGFIELD
                ,DBNAME
                ,COUNT(*)
            FROM APPCHANGEHIST A
                ,DATABASEFIELD D
            WHERE A.CHGFIELD = D.FIELDNUM
                AND trunc(CHGDATE) BETWEEN add_months(to_date(to_char((sysdate - to_char(sysdate, 'dd') + 1), 'dd-mon-yyyy')), - 1)
                    AND to_date(to_char((sysdate - to_char(sysdate, 'dd')), 'dd-mon-yyyy'))
                AND CHGFIELD = 79
                AND OLDVALUE IS NOT NULL
                AND EXISTS (
                    SELECT 1
                    FROM USERPROF
                    WHERE USERID = A.CHGREQUESTOR
                    )
            GROUP BY TO_CHAR(CHGDATE, 'yyyy-mm')
                ,CHGFIELD
                ,DBNAME
            ORDER BY 1
                ,4 DESC

1 Ответ

1 голос
/ 01 апреля 2020

Хорошо, на высоком уровне вы можете использовать следующий шаблон:

WITH results AS
(
  SELECT *
  FROM dual d
  WHERE d.dummy = 'Y'
)
SELECT *
FROM results
UNION ALL
SELECT 'No Rows Found'
FROM dual
WHERE NOT EXISTS (SELECT 'X'
                  FROM results);

Вы можете поиграть с этим, изменив значение в предложении WITH между «X» и «Y». В вашем запросе вы просто замените SELECT в предложении WITH на ваш запрос.

...