Posted on 2024/07/14, 5:08 PM By admin22
PostgreSQLのJSON Query についてのメモです。
便利なのでPrismaでデータを作って、クエリのテストをしてみました。
schema.prisma
model jdata {
id String @id @default(uuid())
info Json
createdAt DateTime @default(now())
}
まずJSONの配列の中から目的のデータを取り出すことを試しました。ここでやりたかったことは、配列をレコードにすることです。
json_array_elements
データを取得してからコードで編集する方法もありますが、複雑なデータの場合はある程度DBクエリの段階でやっておくのもいいかと思ったからです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
prisma2=# select info->'arr' from jdata; ?column? ----------------------------------------------------------------------------------------------- [{"id": "a", "name": "name01"}, {"id": "b", "name": "name02"}] [{"id": "c", "name": "name03"}, {"id": "d", "name": "name04"}, {"id": "e", "name": "name05"}] [{"id": "a", "name": "name01"}] (4 rows) prisma2=# select info->'arr'->0 from jdata; ?column? ------------------------------- {"id": "a", "name": "name01"} {"id": "c", "name": "name03"} {"id": "a", "name": "name01"} (4 rows) prisma2=# select info->'arr'->1 from jdata; ?column? ------------------------------- {"id": "b", "name": "name02"} {"id": "d", "name": "name04"} (4 rows) prisma2=# select info->'arr'->0 from jdata where info->'arr'->0->>'id' = 'a'; ?column? ------------------------------- {"id": "a", "name": "name01"} {"id": "a", "name": "name01"} (2 rows) prisma2=# select info->'arr'->0 from jdata where info->'arr'->0->>'id' = 'c'; ?column? ------------------------------- {"id": "c", "name": "name03"} (1 row) prisma2=# select info->'arr' from jdata where info->'arr'->0->>'id' = 'c'; ?column? ----------------------------------------------------------------------------------------------- [{"id": "c", "name": "name03"}, {"id": "d", "name": "name04"}, {"id": "e", "name": "name05"}] (1 row) prisma2=# select json_array_elements((info->'arr')::json) from jdata where info->'arr'->0->>'id' = 'c'; json_array_elements ------------------------------- {"id": "c", "name": "name03"} {"id": "d", "name": "name04"} {"id": "e", "name": "name05"} (3 rows) prisma2=# select * from(select json_array_elements((info->'arr')::json) as js from jdata where info->'arr'->0->>'id' = 'c') where js->>'name' = 'name05'; js ------------------------------- {"id": "e", "name": "name05"} (1 row) |
すぐ忘れてしまうのでメモでした。
関連)
Categories: 未分類 タグ: SQL