如果我没有返回任何行,并且想要硬编码计数和sysdate信息的默认值'0‘,我该如何重写这个oracle查询?
如果没有数据,我的查询现在会给出这样的结果:
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发布于 2011-07-27 03:13:46
group by正在阻止这一点仅仅通过默认来工作。
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,时间戳
发布于 2011-07-27 03:12:34
试一试
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这将返回实际数据(如果存在),如果不是默认数据
发布于 2011-07-27 03:21:58
试试这个:
SELECT count(*) as MYCNT, timestamp
FROM TESTDATA
WHERE timestamp = to_char(sysdate-2, 'yyyymmdd') || '0000'
GROUP BY timestamp
UNION
SELECT 0, '201107250000'
FROM dualhttps://stackoverflow.com/questions/6835179
复制相似问题