簡體   English   中英

MariaDB JSON 查詢

[英]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-202021-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())

dbfiddle 上的演示

暫無
暫無

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

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