あなたが実際にやろうとしていることは、次のようになるはずです。
SELECT COALESCE((
SELECT now() - min(AcctStartTime)
FROM radacct
WHERE userName = 'test156'), interval '0s')
副選択 (エイリアスを使用elapsed_time_from_first_login
) で行が見つからない場合は、NULL 値が返されますが、行は返されません。
これをキャッチするwhole sub-select
には、COALESCE
ステートメントでラップします。これはCASE
、目的よりも簡単です。
min()
最初は「行なし」を に変換する集計関数を見落としていましたNULL
。したがって、副選択に集約関数がある限り、以下の単純な形式でも同じように機能します。効果を示す sqlfiddleの簡単なデモを次に示します。
あなたのクエリに関する他の問題はすでに指摘されています。しかし、これははるかに簡単な解決策です。interval
ではなくを返しますinteger
。
整数に変換
@artaxerxe によるコメントの後、簡素化されました。
単純なフォームは、「行なし」をチェックせずにジョブを実行します。
SELECT COALESCE(EXTRACT(epoch FROM now() - min(AcctStartTime))::int, 0)
FROM radacct
WHERE userName = 'test156';
詳細についてEXTRACT(epoch FROM INTERVAL)
はマニュアルを参照してください。
集計関数と NULL
もう1つ注意:最初の質問で使用したのとは異なり、集計関数を使用した場合、結果は異なりcount()
ます。を返さないという点で、標準の集約関数の中で特殊なケースです。値 (または行) が見つからない場合は、代わりに返されます。sum()
count()
NULL
0
集計関数に関するマニュアルからのこの抜粋は、それをかなりカバーしているようです:
count を除いて、行が選択されていない場合、これらの関数は null 値を返すことに注意してください。特に、sum of no rows は予想されるゼロではなく null を返し、入力行がない場合、array_agg は空の配列ではなく null を返します。合体関数を使用して、必要に応じて null をゼロまたは空の配列に置き換えることができます。