PostgreSQL CASE… END с несколькими условиями

102

Вот выдержка из моей таблицы:

  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?

Спасибо за помощь и совет!

Wiltomap
источник
Можете ли вы отобразить значение NULL там, где оно равно NULL (чтобы мы могли видеть разницу между NULL и пустой строкой)? NULLНапример , строка, содержащая, например,
Paco
2
У вас также есть проблема со скобками. Почему после 1980 года стоит закрывающая скобка? (в обоих местах)
Пако

Ответы:

166

Такой код, возможно, подойдет вам

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 06
Могу я пропустить ЕЩЕ?
Зон
ELSE не является обязательным. Без ELSE выражение вернет NULL, если ни одно из десяти предложений WHEN не соответствует.
Klaws