PostgreSQL CASE… END z wieloma warunkami

99

Oto fragment mojej tabeli:

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

Chcę wypełnić kolumnę PVC za pomocą SELECT CASEponiższego:

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 ;

Rezultatem jest ta sama zawartość co tabela źródłowa, nic się nie stało i nie otrzymuję komunikatu o błędzie w plikach pg_log. Może to być błąd składni lub problem z użyciem wielu warunków w klauzulach WHEN?

Dzięki za pomoc i radę!

wiltomap
źródło
Czy możesz wyświetlić wartość NULL tam, gdzie jest pusta (abyśmy mogli zobaczyć różnicę między NULL a pustym ciągiem)? Tak jak w, ciąg zawierający NULLna przykład
Paco
2
Masz również problem z nawiasami. Dlaczego po 1980 roku istnieje nawias zamykający? (w obu miejscach)
Paco

Odpowiedzi:

162

Ten rodzaj kodu powinien być prawdopodobnie odpowiedni dla Ciebie

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)
Soni Harriz
źródło
2
Prawie idealnie ;-)! Chciałbym po prostu wymienić ELSE '00'się ELSE pvctak, że można zachować istniejące wartości w pvckolumnie, w przeciwnym razie są one porysowane z „00” (case pvc IS NOT NULL). Wielkie dzięki!
wiltomap
Czy mogę pominąć INNE?
Zon
ELSE jest opcjonalne. Bez ELSE wyrażenie zwróci NULL, jeśli żadna z dziesięciu klauzul WHEN nie pasuje.
Klaws