выбрать из строки из файла json в postgresql - PullRequest
0 голосов
/ 30 мая 2019

В Postgre SQL моя таблица имеет столбец атрибутов в формате JSON ниже

{"color": true,"view": [184],"school": 
[805,812,855,856,857]} 

Я бы хотел написать колонку, в которой если в школе содержится 805 812 855, то еще 1 - 0. Ниже я попробовал, но она не работает.

 case when  json_extract_path_text(attributes, 'school') in 
 [805,812,855] then 1 else 0 end as school

Как я могу это исправить? Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Вы можете использовать боковое перекрестное соединение, чтобы создать массив для каждой строки и посмотреть, содержит ли он значения в [805,812,855]. Здесь я предполагаю, что вы хотите убедиться, что он содержит ВСЕ значения, а не ЛЮБОЕ из значений.

with data as (select * from (values
  ('{"color": true,"view": [184],"school":[805,812,855,856,857]}'::jsonb),
  ('{"color": true,"view": [184],"school":[805,812]}'::jsonb)
) as v(data))
SELECT school_arr @> '{805,812,855}'
FROM data
CROSS JOIN LATERAL (SELECT ARRAY(SELECT jsonb_array_elements_text(data -> 'school'))) d(school_arr)
;
 ?column?
----------
 t
 f
(2 rows)
1 голос
/ 30 мая 2019

На самом деле я получил ответ

case when json_extract_path_text(attributes, 'school')::jsonb@>'805' then 1 
     when json_extract_path_text(attributes, 'school')::jsonb@>'812' then 1
     when json_extract_path_text(attributes, 'school')::jsonb@>'855' then 1
else 
0 end as school
...