Как я могу иметь оператор SQL CASE для генерации отличительного вывода - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь создать двоичный столбец на основе значения другого столбца. Когда wijkcode равно 34406 stadsdeel, должно быть присвоено значение Center, во всех остальных случаях Misc.

update event_locations
set stadsdeel = temp.stadsdeel
from (select wijkcode,
             case wijkcode when 34406 then 'Center'
                  else 'Misc'
             end as stadsdeel
      from event_locations
      ) as temp;

select * from event_locations;

и часть его выхода:

34406;"Center"
34406;"Center"
34406;"Center"
34408;"Center"
34409;"Center"
34403;"Center"
34406;"Center"
31005;"Center"

Пока должно быть:

34406;"Center"
34406;"Center"
34406;"Center"
34408;"Misc"
34409;"Misc"
34403;"Misc"
34406;"Center"
31005;"Misc"

Все коды «Центр». Очевидно, я делаю что-то не так. Я попытался case when wijkcode = 34406, но это приводит к тому же выводу. Кто-то знает, что я делаю неправильно?

Ответы [ 2 ]

2 голосов
/ 08 марта 2020

Почему бы не использовать выражение CASE в качестве устанавливаемого значения:

update event_locations
set stadsdeel = case wijkcode 
  when 34406 then 'Center'
  else 'Misc'
end

См. demo . Результаты:

| wijkcode | stadsdeel |
| -------- | --------- |
| 34406    | Center    |
| 34406    | Center    |
| 34406    | Center    |
| 34408    | Misc      |
| 34409    | Misc      |
| 34403    | Misc      |
| 34406    | Center    |
| 31005    | Misc      |
1 голос
/ 08 марта 2020

Что вы делаете неправильно, так это то, что ваш подзапрос не связан с основным запросом. В результате получается продукт по Карте: каждая строка назначения обновляется с каждой строкой подзапроса. Вы можете добавить where temp.wijkcode = dst.wijkcode к запросу, чтобы выбрать только одну строку на строку из подзапроса.

(или использовать компактную форму, как показано в ответе @forpas)


update event_locations dst
set stadsdeel = temp.stadsdeel
from (select wijkcode,
             case wijkcode when 34406 then 'Center'
                  else 'Misc'
             end as stadsdeel
      from event_locations
      ) as temp
WHERE temp.wijkcode = dst.wijkcode -- <<-- connect temp to the main query
        ;

Но вы также можете поместить соединение внутри в подзапросе, теперь оно будет давать ровно одну совпадающую икру на строку:


update event_locations dst
set stadsdeel = temp.stadsdeel
from (select 
             case wijkcode when 34406 then 'Center' else 'Misc' end as stadsdeel
      from event_locations src
        WHERE src.wijkcode = dst.wijkcode
      ) as temp;

Или вы можете уменьшить подзапрос до скалярного подзапроса, в результате чего будет получено только одно * значение в строке. запросы в один: таблица в основном обновляется из себя, в любом случае:


update event_locations
set stadsdeel = case wijkcode when 34406 then 'Center' else 'Misc' end
        ;
...