本文主要介紹如何在PostGreSql中提取出jsonb類型字段中的某個key的值
參考:https://www.cnblogs.com/mywebnumber/p/5551092.html
一、簡單模式
- 只有一個{}
# rule_config 字段格式 { "cardType": 1, "sellPrice": null, "originPrice": 15 } # 獲取cardType SELECT rule_config -> 'cardType' AS cardType FROM t_free_ride_card_rule_config WHERE title = '測試0211'
- 只有一個[]
# rule_config字段格式 [ "zero", "one", "two" ] # 獲取第一個元素 SELECT rule_config ->0 AS cardType FROM t_free_ride_card_rule_config WHERE title = '測試0211'
- 兩個{}並列
# rule_config字段格式 [ { "ruleGuid": "1125720873758932994", "mcardType": 1, "packStart": "2020-02-14", }, { "ruleGuid": "1073055433702576129", "mcardType": 1, "packExpire": "2020-02-18" } ] # 獲取key為ruleGuid 和 ruleGuid 的值 SELECT json_array_elements ( rule_config :: json ) -> 'ruleGuid' AS ruleGuid, json_array_elements ( rule_config :: json ) -> 'mcardType' AS mcardType FROM t_free_ride_card_rule_config WHERE title = '測試0211'
二、復雜格式
- jsonb數據格式如下
[ { "platform": 0, "cardPackage": [ { "ruleGuid": "1125720873758932994", "mcardType": 1, "packStart": "2020-02-14", "packExpire": "2020-02-15" }, { "ruleGuid": "1073055433702576129", "mcardType": 1, "packStart": "2020-02-16", "packExpire": "2020-02-18" } ], "platformExpire": "2020-02-18" } ]
- 獲取相關字段的sql
# 第一種,嵌套sql SELECT bottom :: json ->> 'ruleGuid' AS ruleGuid FROM ( SELECT json_array_elements ( cardPackage ) AS bottom FROM ( SELECT expire_info :: json -> 'cardPackage' AS cardPackage FROM ( SELECT expire_info :: json -> 0 AS expire_info FROM t_ev_month_card WHERE user_new_id = '1200107139' ) AS A ) AS B ) AS F
說明:
第一層sql:SELECT expire_info :: json -> 0 AS expire_info FROM t_ev_month_card WHERE user_new_id = '1200107139' 獲取到最外層1個{}的數據,命名為expire_info列
第二層sql:從最外層花括號里expire_info獲取到 key = “cardPackage” 的內容 expire_info :: json -> 'cardPackage' ,命名為 cardPackage列
第三層sql:將cardPackage列的內容分為單獨的{}
第四層sql:從每個單獨的{}中取出ruleGuid字段(見 一、(1)節)# 第二種, SELECT (json_array_elements((expire_info -> 0):: json ->'cardPackage'))->'ruleGuid' AS a FROM t_ev_month_card WHERE user_new_id = '1200107139'
如果數據類型是jsonb,也可以將json替換成jsonb:
SELECT bottom :: jsonb -> 'ruleGuid' AS ruleGuid FROM ( SELECT jsonb_array_elements ( cardPackage ) AS bottom FROM ( SELECT expire_info :: jsonb -> 'cardPackage' AS cardPackage FROM ( SELECT expire_info :: jsonb -> 0 AS expire_info FROM t_ev_month_card WHERE user_new_id = '1200107139' ) AS A ) AS B ) AS F