【问题标题】:MySQL JSON: finding value of sibling element in sub-arrayMySQL JSON:在子数组中查找兄弟元素的值
【发布时间】:2019-10-07 23:13:09
【问题描述】:

我的 MariaDB 10.2 的 JSON 类型 (LONGTEXT) 列中有以下(伪)JSON

{"order":
    {"otherstuff":...},
    {"dates":
        [
            {
            "typeId":2,
            "date":"2019-05-21 09:00:00"
            },
            {
            "typeId":4,
            "date":"2019-05-21 10:00:00"
            }
        ]
    }
}

我需要的是订单的日期,而我知道我需要哪种类型 (4)。 一个订单可以有多个由它们的 typeId 标识的日期。 typeId 4 并不总是排在第二位。

SELECT JSON_UNQUOTE(JSON_SEARCH(`json`, 'one', 4, NULL, '$.dates[*].typeId'))
// gives me: $.dates[1].typeId

我现在的第一个想法是REPLACE typeId 与日期,但这抱怨混合排序规则。 我将如何(更优雅地)在这里引用“日期”值?

此外,查询应该是我表中GENERATED 列的表达式。由于日期 id4 不一定适用于每个订单,因此我尝试了以下操作:

SELECT IF(4 IN (JSON_EXTRACT(json, '$.dates[*].typeId')), 'yes', 'no')
// above condition evaluates to [2, 4]

我已经修剪掉了 '[' 和 ']' 但是如果 4 是数组中的第一个(它是一个数组吗?),它只会给我一个“是”。 所以(不带括号):

[4, 7] -> 是的

[2, 4] -> 没有

我假设这不会被识别为一个值数组而是一个字符串。那为什么如果我的针在第一个位置它会给我“是”呢?

我显然想使用日期和 NULL,而不是 yes 和 no。

MySQL JSON 函数对我来说是全新的。那么也许有人可以指出我正确的方向?

【问题讨论】:

    标签: mysql json mariadb


    【解决方案1】:

    试试:

    选项 1

    SELECT
      JSON_UNQUOTE(
        JSON_EXTRACT(
          `json`,
          REPLACE(
            JSON_UNQUOTE(
              JSON_SEARCH(
                `json`,
                'one',
                4,
                NULL,
                '$.order.dates[*].typeId'
              )
            ),
            'typeId',
            'date'
          )
        )
      ) `date`;
    

    选项 2

    SELECT
      IF(
        JSON_CONTAINS(
          JSON_EXTRACT(
            `json`,
            '$.order.dates[*].typeId'
          ),
          4
        ),
        'yes',
        'no'
      ) `exists`;
    

    dbfiddle

    【讨论】:

    • 谢谢。我在同一条路上,明天将检查第一个选项。 REPLACE 引发了混合排序错误/警告。我对此感到惊讶,因为一切都在 utf-8 上运行 - 应该没问题。但我会进一步跟进。第二个选项“JSON_CONTAINS”看起来很有希望。我想我正在寻找类似的东西。正如我所说,明天会回来尝试一下。现在谢谢。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多