Birden çok değere karşı PostgreSQL JSON sorgu dizisi


18

Ben jsonbbir dizi müşteri kimlikleri karşılık gelen grupları bulacaksınız verilen Postgres türüne karşı bir sorgu yazmak istiyorum .

Bu örnek tablo verildiğinde:

CREATE TABLE grp(d JSONB NOT NULL);

INSERT INTO grp VALUES
   ('{"name":"First","arr":["foo"], "customers":[{"id":"1", "name":"one"},{"id":"2", "name":"two"}]}')
 , ('{"name":"Second","arr":["foo","bar"], "customers":[{"id":"3", "name":"three"},{"id":"4", "name":"four"}]}')
 , ('{"name":"Third","arr":["bar","baz"], "customers":[{"id":"5", "name":"five"},{"id":"6", "name":"seven"}]}');

Benzer bir soru buldum ( PostgreSql JSONB SELECT birden çok değere karşı ) ve bu sorguyu kullanarak basit dizide istediğimi elde etmeyi başardım:

SELECT d FROM grp WHERE d->'arr' ?| ARRAY['foo', 'bar'];

Ancak, dizi JSON nesneleri içerdiğinde çalıştıramıyorum :

SELECT d FROM grp WHERE d->'customers' ?| ARRAY['{"id":"1"}', '{"id":"5"}'];

İşte benim sorgu beklediğiniz:

grp "İlk" -> müşteri "1"

grp "Üçüncü" -> müşteri "5"

Yanıtlar:


17

Bir yol var: çevreleme operatörünü @>ANYyapı ile birleştirin :

SELECT d
FROM   grp
WHERE  d->'customers' @> ANY (ARRAY ['[{"id":"1"}]', '[{"id":"5"}]']::jsonb[]);

Veya:

...
WHERE d->'customers' @> ANY ('{"[{\"id\": \"1\"}]","[{\"id\": \"5\"}]"}'::jsonb[]);

Diziyi jsonb[]açıkça yayınlamak çok önemlidir . Ve her öğenin operatörün gerektirdiği gibi bir JSON dizisi olduğunu unutmayın @>. Yani bir dizi JSON dizisi.

Bunun için bir dizin kullanabilirsiniz:

Bu kılavuz , operatörün yalnızca dizeler?| için olduğunu açıkça belirtir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.