PostGreSql - 提取jsonb数据

本文主要介绍如何在PostGreSql中提取出jsonb类型字段中的某个key的值

简单模式

只有一个 { }

# 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

如果数据类型是jsonb,也可以将json替换成jsonb

# 第一种,嵌套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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值