[英]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 查詢(在trackStatus
和nextStatusIndex
)查詢這個 JSON 給定數據的格式。
在 MySQL 8.0 中,可以將內部 JSON 數組轉換為具有函數JSON_TABLE()
的記錄集,然后對其進行檢查。
這是 5.7 版的解決方案,它依賴於JSON_SEARCH()
和JSON_EXTRACT()
。
此查詢將為您提供屬性value
設置為4
的trackStatus
數組中(第一個)元素的屬性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.