sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur frågar jag med fält i den nya PostgreSQL JSON-datatypen?

Postgres 9.2

Jag citerar Andrew Dunstan på pgsql-hackarlistan:

I något skede kommer det möjligen att finnas vissa json-bearbetande (i motsats till json-producerande) funktioner, men inte i 9.2.

Hindrar inte honom från att tillhandahålla ett exempel på implementering i PLV8 som borde lösa ditt problem. (Länken är död nu, se modern PLV8 istället.)

Postgres 9.3

Erbjuder en arsenal av nya funktioner och operatörer för att lägga till "json-processing".

  • Handboken om nya JSON-funktioner.
  • Postgres Wiki om nya funktioner på sidan 9.3.

Svaret på den ursprungliga frågan i Postgres 9.3:

SELECT *
FROM   json_array_elements(
  '[{"name": "Toby", "occupation": "Software Engineer"},
    {"name": "Zaphod", "occupation": "Galactic President"} ]'
  ) AS elem
WHERE elem->>'name' = 'Toby';

Avancerat exempel:

  • Frågekombinationer med kapslad array av poster i JSON-datatypen

För större tabeller kanske du vill lägga till ett uttrycksindex för att öka prestandan:

  • Index för att hitta ett element i en JSON-array

Postgres 9.4

Lägger till jsonb (b för "binär", värden lagras som infödda Postgres-typer) och ännu mer funktionalitet för båda typer. Förutom uttrycksindex som nämns ovan, jsonb stöder även GIN-, btree- och hashindex, GIN är den mest potenta av dessa.

  • Handboken om json och jsonb datatyper och funktioner.
  • Postgres Wiki på JSONB på sidan 9.4

Manualen går så långt att den föreslår:

Generellt sett bör de flesta applikationer föredra att lagra JSON-data somjsonb , såvida det inte finns ganska specialiserade behov, såsom äldre antaganden om beställning av objektnycklar.

Djärv betoning min.

Prestanda gynnas av allmänna förbättringar av GIN-index.

Postgres 9.5

Fyll i jsonb funktioner och operatörer. Lägg till fler funktioner för att manipulera jsonb på plats och för visning.

  • Stora goda nyheter i versionskommentarerna för Postgres 9.5.


  1. CASE NÄR uttalande för ORDER BY-klausul

  2. SQLite JSON_SET()

  3. Data fylls i från en viss tabells datum istället för alla tabeller i sqlite

  4. MySQL-fjärranslutning misslyckas med okänd autentiseringsmetod