【发布时间】: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 函数对我来说是全新的。那么也许有人可以指出我正确的方向?
【问题讨论】: