Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
501 views
in Technique[技术] by (71.8m points)

sql - JSON database table query

I have JSON table with some objects and I am trying to query the amount value in the object

{
"authorizations": [
{
  "id": "d50",
  "type": "passed",
  "amount": 100,
  "fortId": 5050,
  "status": "GENERATED",
  "voided": false,
  "cardNumber": 3973,
  "expireDate": null,
  "description": "Success",
  "customerCode": "858585",
  "paymentMethod": "cash",
  "changeDatetime": null,
  "createDatetime": 000000000,
  "reservationCode": "202020DD",
  "authorizationCode": "D8787"
},
{
  "id": "d50",
  "type": "passed",
  "amount": 100,
  "fortId": 5050,
  "status": "GENERATED",
  "voided": false,
  "cardNumber": 3973,
  "expireDate": null,
  "description": "Success",
  "customerCode": "858585",
  "paymentMethod": "cash",
  "changeDatetime": null,
  "createDatetime": 000000000,
  "reservationCode": "202020DD",
  "authorizationCode": "D8787"
 }
 ],
 }

I have tried the following four options, but none of these give me the value of the object:

SELECT info @> 'authorizations:[{amount}]'
FROM idv.reservations;

SELECT info -> 'authorizations:[{amount}]'
FROM idv.reservations;

info -> ''authorizations' ->> 'amount'
FROM idv.reservations

select (json_array_elements(info->'authorizations')->'amount')::int from idv.reservations

note I am using DBeaver


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

If you want one row per object contained in the "authorizations" JSON array, with the corresponding amount, you can use a lateral join and jsonb_array_elements():

select r.*, (x.obj ->> 'amount')::int as amount
from reservations r
cross join lateral jsonb_array_elements(r.info -> 'authorizations') x(obj)

We can also extract all amounts at once and put them in an array, like so:

select r.*, 
    jsonb_path_query_array(r.info, '$.authorizations[*].amount') as amounts
from reservations r

Demo on DB Fiddlde


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...