2015-06-24 2 views
0

Таблица:Запросы к jsonb массива в Postgres

CREATE TABLE appointment 
(
    id bigserial NOT NULL, 
    date_of_visit timestamp without time zone NOT NULL, 
    symptoms text[], 
    diseases text[], 
    lab_tests text[], 
    prescription_id bigint NOT NULL, 
    medicines jsonb, 
    CONSTRAINT appointment_pkey PRIMARY KEY (id), 
    CONSTRAINT appointment_prescription_id_fkey FOREIGN KEY (prescription_id) 
    REFERENCES prescription (id) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION 
) 
WITH (
    OIDS=FALSE 
); 

Вставить заявление:

INSERT INTO appointment values(
    1, 
    now(), 
    '{"abc","def","ghi"}', 
    '{"abc","def","ghi"}', 
    '{"abc","def","ghi"}', 
    1, 
    '[{"sku_id": 1, "company": "Magnafone"}, {"sku_id": 2, "company": "Magnafone"}]') 

Я пытаюсь запрос к столбцу типа jsonb массива в Postgres. У меня было какое-то решение, как показано ниже. Как-то не работает Ошибка: Cannot extract elements from a scalar.

SELECT distinct(prescription_id) 
FROM appointment 
WHERE to_json(array(SELECT jsonb_array_elements(medicines) ->>'sku_id'))::jsonb ?|array['1'] 
LIMIT 2; 

Update: Запрос работает нормально. Некоторое нежелательное значение в столбце было для некоторых других строк, из-за которых оно не было запущено.

ответ

2

В таблице есть строки, содержащие скалярное значение в столбце medicines вместо массива. Вы должны проверить и правильно обновить данные. Вы можете найти эти строки с этим запросом:

select id, medicines 
from appointment 
where jsonb_typeof(medicines) <> 'array'; 

В качестве альтернативы, вы можете проверить тип значений в этом столбце в запросе:

select prescription_id 
from (
    select distinct on (prescription_id) 
     prescription_id, 
     case 
      when jsonb_typeof(medicines) = 'array' then jsonb_array_elements(medicines) ->>'sku_id' 
      else null 
     end as sku_id 
    from appointment 
    ) alias 
where sku_id = '1' 
limit 2; 

или просто исключить значения не массив в where clause:

select prescription_id 
from (
    select distinct on (prescription_id) 
     prescription_id, 
     jsonb_array_elements(medicines) ->>'sku_id' as sku_id 
    from appointment 
    where jsonb_typeof(medicines) = 'array' 
    ) alias 
where sku_id = '1' 
limit 2; 
+0

Последний запрос работает нормально !! Когда я запускал первый, у меня было два нулевых поля. Запрос, который я поставил в вопросе, также работает отлично! Благодарю. –

Смежные вопросы