2

行が返されず、カウントと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
4

3 に答える 3

2

group byは、これが単にdefultによって機能するのを防いでいます。

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' 

2番目のバージョンは空白を返し、最初のバージョンは0とタイムスタンプを返します

于 2011-07-26T19:13:45.787 に答える
0

試す

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-26T19:12:34.180 に答える
0

これを試して:

 SELECT count(*) as MYCNT, timestamp 
FROM TESTDATA 
WHERE timestamp = to_char(sysdate-2, 'yyyymmdd') || '0000' 
GROUP BY timestamp 
UNION
SELECT 0, '201107250000'
  FROM dual
于 2011-07-26T19:21:58.310 に答える