2017-02-06 3 views
3

私は次のクエリがありますCASEを使用してNULLにフィールドを設定すると、PostgreSQLがタイプについて文句を言うのはなぜですか?

UPDATE managed_avs 
    SET own_license_expires_at = CASE id WHEN 50 THEN NULL END 
WHERE id in (50) 

を私は次のエラーを取得する:

ERROR: column "own_license_expires_at" is of type timestamp without time zone but expression is of type text 
LINE 1: update managed_avs set own_license_expires_at = CASE id WHEN... 
                 ^
HINT: You will need to rewrite or cast the expression. 

なぜそれがCASE id WHEN 50 THEN NULL ENDがtext型であることを言うのでしょうか? NULLではないですか?

+1

なぜ最初に 'case'を使用しますか?文全体が 'update managed_avs SET own_license_expires_at = null where id = 50'と同等です。 –

+0

@a_horse_with_no_nameしかし、なぜこれが起こっているのか興味深いです、あなたは説明をしていますか? 'timestamp'はPostgres AFAIKでnullableです。 –

+0

@a_horse_with_no_nameこのクエリは生成され、複数の行を更新するためのものです。ここでは簡略化した例を示しました。 –

答えて

2

これは、ケース式がすべての結果に対してnullの値を返すためです。 nullの値には型がないため、Postgresのデフォルトはtextです。

あなたはpg_typeof()を使用していることを確認することができます

select pg_typeof(case id when 50 then null end) 
from (values (50)) as x (id); 

戻り

pg_typeof 
--------- 
text  

をこのタイムスタンプまたは式全体にキャストするwhenニーズの結果のいずれかを動作させるためには:

case id when 50 then null::timestamp end 

または

(case id when 50 then null end)::timestamp 
+0

ありがとう!私の列は 'timestamp without time zone'型であるため、' cast(時空間のないタイムスタンプとして50の場合はnull) 'を使用して終了しました。 –

+0

私は 'null ::タイムゾーンなしのタイムスタンプ'はタイプ名のスペースのために動作しないと思っていましたが、私はそれを試してみました。 –

関連する問題