PostgreSQL CASE… KẾT THÚC với nhiều điều kiện


97

Đây là bảng trích xuất của tôi:

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

Tôi muốn điền vào cột PVC bằng cách sử dụng một SELECT CASEnhư sau:

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 ;

Kết quả là nội dung giống như bảng nguồn, không có gì xảy ra và tôi không nhận được thông báo lỗi trong tệp pg_log. Đó có thể là lỗi cú pháp hoặc vấn đề với việc sử dụng nhiều điều kiện trong mệnh đề WHEN?

Cảm ơn sự giúp đỡ và lời khuyên!


Bạn có thể hiển thị giá trị NULL khi nó là null (để chúng ta có thể thấy sự khác biệt giữa chuỗi NULL và chuỗi rỗng) không? Như trong, một chuỗi có chứa NULLví dụ
Paco

2
Bạn cũng gặp sự cố với dấu ngoặc. Tại sao lại có dấu ngoặc kép sau năm 1980? (ở cả hai nơi)
Paco

Câu trả lời:


156

Loại mã này có lẽ sẽ phù hợp với bạn

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
Gần như hoàn hảo ;-) ! Tôi sẽ chỉ thay thế ELSE '00'bằng ELSE pvcđể tôi có thể giữ các giá trị hiện có trong pvccột, nếu không chúng sẽ bị xước với '00' (trường hợp pvc IS NOT NULL). Cảm ơn rất nhiều!
wiltomap

Tôi có thể bỏ qua ELSE không?
Zon

ELSE là tùy chọn. Nếu không có ELSE, biểu thức sẽ trả về NULL khi không có mệnh đề nào trong số mười mệnh đề WHEN phù hợp.
Klaws
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.