gpt4 book ai didi

MySQL JSON : finding value of sibling element in sub-array

转载 作者:行者123 更新时间:2023-11-29 16:00:30 24 4
gpt4 key购买 nike

我的 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

我现在的第一个想法是用日期替换 typeId,但这会提示混合排序规则。我如何(更优雅地)在这里引用“日期”值?

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

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

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

[4, 7] -> 是

[2, 4] -> 否

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

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

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

最佳答案

尝试:

选项 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 .

关于MySQL JSON : finding value of sibling element in sub-array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56240310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com