sql >> Databasteknik >  >> RDS >> PostgreSQL

jsonb LIKE-fråga på kapslade objekt i en array

Din lösning kan förenklas ytterligare:

SELECT r.res->>'name' AS feature_name, d.name AS detail_name
FROM   restaurants r
     , jsonb_populate_recordset(null::foo, r.res #> '{payload, details}') d
WHERE  d.name LIKE '%oh%';

Eller ännu enklare med jsonb_array_elements() eftersom du faktiskt inte behöver radtypen (foo ) alls i det här exemplet:

SELECT r.res->>'name' AS feature_name, d->>'name' AS detail_name
FROM   restaurants r
     , jsonb_array_elements(r.res #> '{payload, details}') d
WHERE  d->>'name' LIKE '%oh%';

dbfiddle här

Men det är inte vad du frågade exakt:

Du returnerar alla JSON-arrayelement (0-n per bastabellrad), där en särskild nyckel ('{payload,details,*,name}' ) matchar (skiftlägeskänsligt).

Och din ursprungliga fråga hade en kapslad JSON-array ovanpå detta. Du tog bort den yttre arrayen för den här lösningen - jag gjorde samma sak.

Beroende på dina faktiska krav new textsökförmåga av Postgres 10 kan vara användbart.



  1. Ändra portvärde configureApplicationServer-attribut Worklight

  2. Mysql find_in_set snedstreck( / ) separator

  3. Vad är ett bra sätt att hantera db-anslutningen i en Google Cloud SQL (GAE) Python-app?

  4. Hur ändrar jag positionen för en kolumn i en PostgreSQL-databastabell?