СПРАВА PostgreSQL ... КІНЕЦЬ із кількома умовами


97

Ось витяг з моєї таблиці:

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

Я хочу заповнити колонку ПВХ, використовуючи 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наприклад,
Пако

2
У вас також є проблема з дужками. Чому після 1980 року існує фінальна дужка? (в обох місцях)
Пако

Відповіді:


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

Чи можу я пропустити ІНШЕ?
Zon

Інше не є обов’язковим. Без ELSE вираз поверне NULL, коли жоден з десяти речень WHEN не збігається.
Klaws
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.