[英]MariaDB JSON Query
我有一個具有以下結構的表:
|id | json |
------------
| | |
------------
JSON結構如下:
{
"roomType": "Deluxe",
"package": "Full-Board +",
"comb": {
"adult": "1",
"infant": "0",
"child": "0",
"teen": "0"
},
"rates": [
{
"rateFrom": "2021-02-11",
"rateTo": "2021-02-20",
"ratePrice": "6000"
}, {
"rateFrom": "2021-02-21",
"rateTo": "2021-02-26",
"ratePrice": "6500"
}]
}
屬性rates
中可以有許多條目。 現在,我需要返回rates
的任何屬性rateTo
大於今天日期的行。
也就是說,如果今天的日期小於rates
條目中的rateTo
一個,則返回該行。
這是我第一次查詢 JSON 並且我不確定我的 JSON 的結構對於我想要執行的查詢類型是否正確。
如果您放棄 JSON 作為數據類型並使用正確標准化的房間、包、梳子(可能是包的一部分?)和費率表,這會容易得多。 但是,如果您被 JSON 卡住,獲取所需數據的一種方法是將每個 JSON 中的所有rateTo
值提取到逗號分隔(並結束)的日期列表中(例如,對於您的示例數據,這將是2021-02-20,2021-02-26,
; 然后將其拆分為單獨的日期2021-02-20
和2021-02-26
,然后如果相關日期之一在今天之后,則從原始表中SELECT
行。你可以這樣做這有幾個遞歸 CTE:
WITH RECURSIVE toDate AS (
SELECT id, CONCAT(REGEXP_REPLACE(JSON_EXTRACT(`json`, '$.rates[*].rateTo'), '[ "\\[\\]]', ''), ',') AS toDates
FROM rooms
),
Dates AS (
SELECT id, SUBSTRING_INDEX(toDates, ',', 1) AS toDate, REGEXP_REPLACE(toDates, '^[^,]+,', '') AS balance
FROM toDate
UNION ALL
SELECT id, SUBSTRING_INDEX(balance, ',', 1), REGEXP_REPLACE(balance, '^[^,]+,', '')
FROM Dates
WHERE INSTR(balance, ',') > 0
)
SELECT *
FROM rooms r
WHERE EXISTS (SELECT *
FROM Dates d
WHERE d.id = r.id AND d.toDate > CURDATE())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.