2017-02-06 2 views
3

I가 다음 쿼리 :CASE를 사용하여 NULL 필드를 설정할 때 PostgreSQL이 타입에 대해 불평을하는 이유는 무엇입니까?

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 유형의 텍스트의 것을 말하는가 : 나는 다음과 같은 오류가

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

? 그냥 NULL이 아닌가요?

+1

왜 처음에는'case'를 사용합니까? 전체 문장은'update managed_avs SET own_license_expires_at = null id = 50'과 동일합니다. –

+0

@a_horse_with_no_name 그래도 이런 일이 일어나고있는 것은 흥미 롭습니다. 설명이 있습니까? 'timestamp'는 Postgres AFAIK에서 nullable입니다. –

+0

@a_horse_with_no_name이 쿼리는 생성되어 여러 행을 업데이트하기위한 것입니다. 나는 여기서 단순화 된 예제를 제공했다. –

답변

2

이 경우는 식 표현식이 가능한 모든 결과에 대해 null 값을 반환하기 때문에 발생합니다. null 값에 유형이 없으므로 Postgres는 기본값이 text입니다. when 요구의 결과 중 하나를 일이 위해서는

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

반환

pg_typeof 
--------- 
text  

타임 스탬프 또는 전체 표현식으로 캐스팅 할 :

당신은 pg_typeof()를 사용하여이 있음을 확인할 수 있습니다 :

case id when 50 then null::timestamp end 

또는

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

감사! 내 칼럼은'타임 스탬프가없는 타임 스탬프 '타입이므로,'cast (타임 스탬프없이 타임 스탬프로 50을 입력하면 null)'을 사용하여 끝났다. –

+0

'null :: timestamp가없는 타임 스탬프 '는 타입 이름의 공백으로 인해 작동하지 않을 것이라고 생각했지만 방금 시도해 보았습니다. –