あなたが実際にやろうとしていることは、次のようになるはずです。
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()NULL0
集計関数に関するマニュアルからのこの抜粋は、それをかなりカバーしているようです:
count を除いて、行が選択されていない場合、これらの関数は null 値を返すことに注意してください。特に、sum of no rows は予想されるゼロではなく null を返し、入力行がない場合、array_agg は空の配列ではなく null を返します。合体関数を使用して、必要に応じて null をゼロまたは空の配列に置き換えることができます。