Как присвоить значение пустому запросу - PullRequest
0 голосов
/ 14 мая 2018

У меня проблема с запросом в Oracle. Я хочу присвоить значение -1, если мой запрос возвращает нулевое значение, и значение идентификатора, если в таблице есть хотя бы значение. Это мой запрос

SELECT IAM_EXP_RESULT_ID
FROM (SELECT * FROM IAM_EXP_RESULT ORDER BY START_DATE  ASC)
WHERE RESULT = 0 AND ROWNUM = 1

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

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Я использую агрегацию для этой цели:

SELECT COALESCE(MAX(IAM_EXP_RESULT_ID), -1)
FROM (SELECT *
      FROM IAM_EXP_RESULT
      ORDER BY START_DATE  ASC
     )
WHERE RESULT = 0 AND ROWNUM = 1;

Запрос агрегации всегда возвращает одну строку, с NULL, если не найдено ни одной строки. COALESCE() заменяет значение на то, что вы хотите.

Примечание. В подзапросе может потребоваться RESULT = 0.

0 голосов
/ 14 мая 2018

Этот общий пример в дополнение к другим вернет значение, если в таблице нет строк и вы не можете использовать count (*) или другую статистическую функцию:

SELECT data_length FROM all_tab_cols
  WHERE owner = 'YOU'
   AND table_name = 'EMP'
   AND column_name = 'ENAMES'
UNION ALL
 SELECT -1 FROM dual
  WHERE NOT EXISTS
 (
  SELECT data_length FROM all_tab_cols
   WHERE owner = 'YOU'
     AND table_name = 'EMP'
     AND column_name = 'ENAMES'
  )
/

Результат запроса выше -1. Верхняя часть может возвращать или не возвращать строки. Если верхняя часть возвращает строки, вы получаете все, что она возвращает. Если нет, то вы получите -1. ​​

0 голосов
/ 14 мая 2018

Вы можете использовать аналитическую функцию COUNT и COALESCE:

SELECT COALESCE(
         IAM_EXP_RESULT_ID,
         CASE WHEN ct > 0 THEN -1 ELSE NULL END
       ) AS IAM_EXP_RESULT_ID
FROM   (
  SELECT IAM_EXP_RESULT_ID,
         RESULT,
         START_DATE,
         COUNT( your_value_column ) OVER () AS ct
  FROM   IAM_EXP_RESULT r
  UNION ALL
  SELECT -1, 0, NULL, 0 FROM DUAL
  ORDER  BY START_DATE ASC NULLS LAST
)
WHERE  RESULT = 0
AND    ROWNUM = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...