PostGreSql - 提取jsonb數據


本文主要介紹如何在PostGreSql中提取出jsonb類型字段中的某個key的值

參考:https://www.cnblogs.com/mywebnumber/p/5551092.html

一、簡單模式

  1. 只有一個{}
    # 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'
      
  2. 只有一個[]
    # rule_config字段格式
    [
      "zero",
      "one",
      "two"
    ]
    
    # 獲取第一個元素
    SELECT
        rule_config ->0  AS cardType 
    FROM
        t_free_ride_card_rule_config 
    WHERE
        title = '測試0211'

     

  3. 兩個{}並列
    # 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM