oracle query help с использованием аналогичной функции NVL для установки по умолчанию - PullRequest
2 голосов
/ 26 июля 2011

Как мне переписать этот оракул-запрос, если у меня нет возвращаемых строк, и я хочу жестко закодировать значение по умолчанию '0' для счетчика и информации о sysdate?

Мой запрос теперь даст мне это, если нет данных:

 1* SELECT count(*) as MYCNT, timestamp FROM TESTDATA WHERE timestamp = to_char(sysdate-2, 'yyyymmdd') || '0000' group by timestamp
SQL> /

no rows selected

Здесь я попробовал NVL, но не получил ожидаемый результат:

1* select nvl(count(*), 0) as MYCNT, to_char(sysdate-2, 'yyyymmdd') || '0000' from TESTDATA WHERE timestamp = to_char(sysdate-2, 'yyyymmdd') || '0000' group by timestamp
SQL> /

no rows selected

Хотите увидеть что-то вроде этого:

MYCNT    TIMESTMP
-----    --------
0        201107250000

Ответы [ 3 ]

2 голосов
/ 26 июля 2011

Группа не позволяет этому просто работать по умолчанию.

select count(*) ,  to_char(sysdate-2, 'yyyymmdd') || '0000' as timestamp 
from dual where 1=0

Вы можете убедиться в этом, сравнив вывод с:

select count(*) ,  to_char(sysdate-2, 'yyyymmdd') || '0000' as timestamp 
from dual where 1=0
group by  to_char(sysdate-2, 'yyyymmdd') || '0000' 

Вторая версия возвращает пустое значение, первая версия возвращает 0 и метка времени

0 голосов
/ 26 июля 2011

Попробуйте это:

 SELECT count(*) as MYCNT, timestamp 
FROM TESTDATA 
WHERE timestamp = to_char(sysdate-2, 'yyyymmdd') || '0000' 
GROUP BY timestamp 
UNION
SELECT 0, '201107250000'
  FROM dual
0 голосов
/ 26 июля 2011

попробовать

SELECT 0, to_char(sysdate-2, 'yyyymmdd') || '0000' FROM DUAL WHERE 0 = 
(SELECT count(*) FROM TESTDATA WHERE timestamp = to_char(sysdate-2, 'yyyymmdd') || '0000')
UNION
SELECT count(*) as MYCNT, timestamp FROM TESTDATA WHERE timestamp = to_char(sysdate-2, 'yyyymmdd') || '0000' group by timestamp

возвращает реальные данные, если они присутствуют, и если не по умолчанию

...