首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MariaDB JSON查询

MariaDB JSON查询
EN

Stack Overflow用户
提问于 2021-02-25 00:44:01
回答 1查看 32关注 0票数 0

我有一个表,结构如下:

代码语言:javascript
复制
|id | json |
------------
|   |      |
------------

JSON结构如下:

代码语言:javascript
复制
{
    "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"
    }]
}

属性率中可以有很多条目。现在,我需要返回来自 rate 的任何属性 rateTo 大于今天日期的行。也就是说,如果今天的日期至少小于一个 rateTo 的条目,则返回该行。这是我第一次查询 JSON,我不确定我的 JSON 结构对于我想要执行的查询类型是否正确。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-25 11:41:40

如果您放弃 JSON 作为数据类型并使用正确标准化的房间、包裹、梳子(可能是包裹的一部分?)和费率表,这会容易得多。但是,如果您坚持使用 JSON,获取所需数据的一种方法是将每个 JSON 中的所有 rateTo 值提取到逗号分隔(并结束)的日期列表中(例如,对于您的示例数据,这将是 2021-02-20,2021-02-26,; 然后将其拆分为单独的日期 2021-02-20 和 2021-02-26,如果关联日期之一在今天之后,则从原始表中选择行。您可以这样做这有几个递归 CTE:

代码语言:javascript
复制
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的演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66355173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档