PostgreSQL CASE… 여러 조건으로 종료


97

다음은 내 테이블의 발췌입니다.

  gid    |    datepose    |    pvc
---------+----------------+------------
 1       |  1961          | 01
 2       |  1949          |
 3       |  1990          | 02
 1       |  1981          |
 1       |                | 03
 1       |                |

다음을 사용하여 PVC 열을 채우고 싶습니다 SELECT CASE.

SELECT

 gid,

 CASE
  WHEN (pvc IS NULL OR pvc = '') AND datpose < 1980) THEN '01'
  WHEN (pvc IS NULL OR pvc = '') AND datpose >= 1980) THEN '02'
  WHEN (pvc IS NULL OR pvc = '') AND (datpose IS NULL OR datpose = 0) THEN '03'
 END AS pvc

FROM my_table ;

결과는 소스 테이블과 동일한 내용이며 아무 일도 일어나지 않았으며 pg_log 파일에 오류 메시지가 표시되지 않습니다. 구문 오류이거나 WHEN 절에서 여러 조건을 사용하는 데 문제가 있습니까?

도움과 조언에 감사드립니다!


NULL 인 곳에 NULL 값을 표시 할 수 있습니까 (NULL과 빈 문자열의 차이를 볼 수 있음)? 마찬가지로, 문자열을 포함하는 NULL, 예를 들면
파코

2
대괄호에도 문제가 있습니다. 1980 년 이후에 닫는 괄호가있는 이유는 무엇입니까? (두 곳 모두에서)
Paco 2015 년

답변:


156

이런 종류의 코드는 아마도 당신을 위해 일할 것입니다

SELECT
 *,
 CASE
  WHEN (pvc IS NULL OR pvc = '') AND (datepose < 1980) THEN '01'
  WHEN (pvc IS NULL OR pvc = '') AND (datepose >= 1980) THEN '02'
  WHEN (pvc IS NULL OR pvc = '') AND (datepose IS NULL OR datepose = 0) THEN '03'
  ELSE '00'
 END AS modifiedpvc
FROM my_table;


 gid | datepose | pvc | modifiedpvc 
-----+----------+-----+-------------
   1 |     1961 | 01  | 00
   2 |     1949 |     | 01
   3 |     1990 | 02  | 00
   1 |     1981 |     | 02
   1 |          | 03  | 00
   1 |          |     | 03
(6 rows)

2
거의 완벽한 ;-)! 난 그냥 대체 할 ELSE '00'ELSE pvc제가의 기존 값을 유지 할 수 있도록 pvc그렇지 않으면 '00'(케이스 흠집, 열 pvc IS NOT NULL). 감사합니다!
wiltomap 2015 년

ELSE를 건너 뛸 수 있습니까?
Zon

ELSE는 선택 사항입니다. ELSE가 없으면 10 개의 WHEN 절이 일치하지 않을 때 표현식이 NULL을 반환합니다.
Klaws
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.