簡體   English   中英

如何查詢包含對象數組的 MySQL JSON 列

[英]How to query MySQL JSON column that contains an array of objects

我有一個具有包含名為狀態的JSON列的表稱為交易一個MySQL(V5.7)數據庫。

狀態包含以下格式的數據(在交易id = 29 中)(對格式表示歉意):

{
    "trackStatus":
    [
        {
            "date":[],
            "notes":[],
            "value":"0",
            "isChecked":false
        },
        {
            "date":["2019-03-25T17:42:45-04:00"],
            "notes":[],
            "value":4,
            "isChecked":true
         }
    ],
    "nextStatusIndex":0, 
    "currentDealStatus":4
}

我正在嘗試查詢trackStatus數組,其中value = 4 to find out if it Checked`。

我從閱讀 MySQL 參考資料中了解到,我需要使用JSON_EXTRACT函數來獲取數據。

在下面的一些示例中,我按如下方式測試了查詢以查看是否可以返回trackStatus

SELECT JSON_EXTRACT(status, '$.trackStatus') 
FROM deals 
WHERE deals.id = 29

這有效並返回trackStatus 但是,當我嘗試對此進行擴展以在trackStatus專門針對isChecked進行查詢時,它不會返回值(不是 null 而是空白)。

SELECT JSON_EXTRACT(status, '$.trackStatus', '$.isChecked') 
FROM deals 
WHERE deals.id = 29 AND JSON_EXTRACT(status, '$.trackStatus', '$.value') = 4

我已經嘗試了無數不同的查詢,以至於我一直在兜圈子。

我意識到問題在於trackStatus因為如果我刪除該數組,我可以查詢nextStatusIndex並且它可以工作。 然而,在那里的數組中,它沒有。

所以我希望有人可以告訴我如何/是否可以使用 MySQL 查詢(在trackStatusnextStatusIndex )查詢這個 JSON 給定數據的格式。

在 MySQL 8.0 中,可以將內部 JSON 數組轉換為具有函數JSON_TABLE()的記錄集,然后對其進行檢查。

這是 5.7 版的解決方案,它依賴於JSON_SEARCH()JSON_EXTRACT()

此查詢將為您提供屬性value設置為4trackStatus數組中(第一個)元素的屬性isChecked value

SELECT JSON_EXTRACT(
    status, 
    REPLACE(
        REPLACE(
            JSON_SEARCH(status, 'all', '4', '', '$.trackStatus[*].value'), 
        '"', ''), 
    '.value', '.isChecked')
) isCheckedAtValue4
FROM deals WHERE deals.id = 29;

使用此 DB fiddle 中的示例數據,將返回:

| isCheckedAtValue4 |
| ----------------- |
| true              |

細節

您可以使用JSON_SEARCH查找屬性value設置為4數組trackStatus中(第一個)元素的路徑:

SELECT JSON_SEARCH(status, 'one', '4', '', '$.trackStatus[*].value')
FROM deals 
WHERE deals.id = 29;

對於您的測試數據,這通常會返回: "$.trackStatus[1].value"

我們可以操縱路徑字符串將其指向同一數組元素的屬性isChecked 周圍的雙引號也需要刪除:

SELECT REPLACE(
    REPLACE(
        JSON_SEARCH(status, 'one', '4', '', '$.trackStatus[*].value'), 
    '"', ''), 
'.value', '.isChecked'),
FROM deals WHERE deals.id = 29;

這將返回: $.trackStatus[1].isChecked

最后,這個表達式可以作為JSON_EXTRACT()的參數給出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM