JSON_EXTRACT函數詳解

JSON_EXTRACT函數是MySQL 5.7版本及以上的新特性之一,它使得我們能夠直接從JSON對象中提取數據。這篇文章將從以下幾個方面對JSON_EXTRACT函數做詳細的闡述:

一、JSON_EXTRACT函數的語法

JSON_EXTRACT函數的語法如下:

JSON_EXTRACT(json_doc, path[, path] ...)

其中,json_doc是要提取數據的JSON文檔,而path則是要提取的數據路徑,可以是一個或多個路徑參數。path參數還支持字符串函數,如CONCAT和SUBSTRING,這些函數可以與路徑參數一起使用。

二、JSON_EXTRACT函數的示例

讓我們通過幾個示例來進一步了解JSON_EXTRACT函數的使用。

1. 從JSON數組中提取元素:可以使用以下命令從JSON數組中提取第一個元素:

SELECT JSON_EXTRACT('[1, 2, 3]', '$[0]');  -- 返回值為1

2. 從嵌套的JSON對象中提取值:假設我們有以下JSON對象:

{
    "name": "John",
    "age": 30,
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "TX",
        "zip": "12345"
    }
}

我們可以使用以下命令從中提取州名稱:

SELECT JSON_EXTRACT('{
    "name": "John",
    "age": 30,
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "TX",
        "zip": "12345"
    }
}', '$.address.state');  -- 返回值為"TX"

3. 提取嵌套的JSON數組:假設我們有以下JSON對象:

{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ]
    }
}

我們可以使用以下命令從中提取所有書籍的價格:

SELECT JSON_EXTRACT('{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ]
    }
}', '$.store.book[*].price');

該命令將返回一個JSON數組,其中包含所有書籍的價格。

三、使用JSON_EXTRACT函數進行數據過濾

除了從JSON文檔中提取數據,JSON_EXTRACT函數還能用於進行數據過濾。通過在WHERE子句中使用JSON_EXTRACT函數,我們可以僅查詢符合特定條件的記錄。

假設我們有以下JSON文檔:

{
  "students": [
    {
      "name": "John Doe",
      "gender": "male",
      "age": 18,
      "graduated": false,
      "scores": [
        {
          "subject": "math",
          "score": 98
        },
        {
          "subject": "history",
          "score": 88
        }
      ]
    },
    {
      "name": "Jane Doe",
      "gender": "female",
      "age": 19,
      "graduated": true,
      "scores": [
        {
          "subject": "math",
          "score": 78
        },
        {
          "subject": "history",
          "score": 92
        }
      ]
    }
  ]
}

我們可以使用以下命令查詢出年齡大於18歲且數學分數大於90分的學生:

SELECT JSON_EXTRACT('{
  "students": [
    {
      "name": "John Doe",
      "gender": "male",
      "age": 18,
      "graduated": false,
      "scores": [
        {
          "subject": "math",
          "score": 98
        },
        {
          "subject": "history",
          "score": 88
        }
      ]
    },
    {
      "name": "Jane Doe",
      "gender": "female",
      "age": 19,
      "graduated": true,
      "scores": [
        {
          "subject": "math",
          "score": 78
        },
        {
          "subject": "history",
          "score": 92
        }
      ]
    }
  ]
}', '$.students[?(@.age > 18 && @.scores[?(@.subject == "math")].score > 90)]');

該命令將返回一個JSON數組,其中包含所有符合條件的學生信息。

四、使用CONCAT和SUBSTRING函數進行數據處理

我們可以在JSON_EXTRACT函數中使用字符串函數進行數據處理,以下是幾個示例:

1. 使用CONCAT函數連接字符串路徑:假設我們要從以下JSON對象中提取州名稱:

{
    "name": "John",
    "age": 30,
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "TX",
        "zip": "12345"
    }
}

我們可以使用以下命令從中提取州名稱:

SELECT JSON_EXTRACT('{
    "name": "John",
    "age": 30,
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "TX",
        "zip": "12345"
    }
}', CONCAT('$.address.', 'state'));  -- 返回值為"TX"

2. 使用SUBSTRING函數截取路徑:假設我們有以下JSON對象:

{
    "product_name": "Awesome Product",
    "features": [
        {
            "name": "Feature A",
            "description": "This is feature A."
        },
        {
            "name": "Feature B",
            "description": "This is feature B."
        },
        {
            "name": "Feature C",
            "description": "This is feature C."
        }
    ]
}

我們可以使用以下命令只獲取features子節點:

SELECT JSON_EXTRACT('{
    "product_name": "Awesome Product",
    "features": [
        {
            "name": "Feature A",
            "description": "This is feature A."
        },
        {
            "name": "Feature B",
            "description": "This is feature B."
        },
        {
            "name": "Feature C",
            "description": "This is feature C."
        }
    ]
}', SUBSTRING('$.features', 2));  -- 返回值為[{...}]

結論

以上就是JSON_EXTRACT函數的詳細介紹,它使得我們能夠方便地從JSON文檔中提取數據,並進行數據過濾和處理。如果您在使用MySQL 5.7及以上版本,那麼JSON_EXTRACT一定會是您的首選函數之一。

原創文章,作者:RJYOC,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/362079.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
RJYOC的頭像RJYOC
上一篇 2025-02-25 18:17
下一篇 2025-02-26 07:53

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字符串操作中,capitalize函數常常被用到,這個函數可以使字符串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29

發表回復

登錄後才能評論