PostgreSQL CASE …จบด้วยหลายเงื่อนไข


104

นี่คือสารสกัดจากตารางของฉัน:

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

ฉันต้องการเติมคอลัมน์ PVC โดยใช้SELECT CASEas bellow:

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 clauses?

ขอบคุณสำหรับความช่วยเหลือและคำแนะนำ!


คุณสามารถแสดงค่า NULL โดยที่มันเป็น null ได้หรือไม่ (เราจะเห็นความแตกต่างระหว่าง NULL และสตริงว่าง) ในฐานะที่เป็นสตริงที่มีNULLตัวอย่างเช่น
Paco

2
นอกจากนี้คุณยังมีปัญหาเกี่ยวกับวงเล็บ เหตุใดจึงมีวงเล็บปิดหลังปี 1980 (ทั้งสองแห่ง)
Paco

คำตอบ:


169

รหัสประเภทนี้น่าจะใช้ได้กับคุณ

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' (case pvc IS NOT NULL) ขอบคุณมาก!
wiltomap

ฉันสามารถข้าม ELSE ได้หรือไม่
Zon

ELSE เป็นทางเลือก หากไม่มี ELSE นิพจน์จะคืนค่า NULL เมื่อไม่มีคำสั่ง WHEN ที่ตรงกัน 10 ข้อ
Klaws
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.