3

Postgres 9.1 を使用しています。次のクエリは期待どおりに機能しません。合体は最初の非 null 値を返す必要があります。ただし、このクエリは日付 (2) ではなく null (1?) を返します。

select COALESCE(
    TO_DATE('','yyyymmdd'), --(1)
    TO_DATE('20130201','yyyymmdd') --(2)
    );

--(1) this evaluates independently to null
--(2) this evaluates independently to the date,
--    and therefore is the first non-null value

私は何を間違っていますか?回避策はありますか?

編集:これは、Coalesce とはまったく関係がない可能性があります。Case When コンストラクトを使っていくつかの実験を試みました。結局のところ、Postgres にはこの大きな醜いバグがあり、それを選択すると null が返されるにもかかわらず、not nullとして扱わTO_DATE('','yyyymmdd')れます。

[ PS:誤解を招くことを避けるため、上に取り消し線を引いてください。Postgres にはバグはありませんが、空の文字列を null として扱いません。回答を参照してください。]

4

1 に答える 1

8
SELECT TO_DATE('','yyyymmdd');

引数としてではNULLなく空の文字列を渡すため、評価されませんNULLTO_DATE()

これは正常にNULLに評価されます

SELECT TO_DATE(NULL,'yyyymmdd');

空の文字列が予想され、それを として扱いたい場合は、NULL使用できますNULLIF()

SELECT TO_DATE(NULLIF(dt, ''),'yyyymmdd')
  FROM 
(
  SELECT CAST('' AS VARCHAR(32)) dt
) q

そうは言っても、(1) を NULL として評価するサンプル コード

SELECT COALESCE(
    TO_DATE(NULLIF('', ''),'yyyymmdd'),       --(1)
    TO_DATE(NULLIF('20130201',''),'yyyymmdd') --(2)
);

そして戻る

| | 合体 |
-----------------------------------
| | 2013 年 2 月 1 日 00:00:00+0000 |

これがSQLFiddleのデモです

于 2013-07-01T04:30:57.207 に答える