gpt4 book ai didi

mysql - WHERE x IN 适用于单个值,不适用于 json 上的多个值

转载 作者:行者123 更新时间:2023-11-29 04:14:57 24 4
gpt4 key购买 nike

在 MySQL 中查询 json 字段有一个难以理解的问题。 data 列是 json 类型。

下面的查询工作得很好

SELECT * FROM `someTable` WHERE data->'$.someData' in ('A')

但是下面的一个什么都不返回。

 SELECT * FROM `someTable` WHERE data->'$.someData' in ('A','B')

有趣的是,这也有效:

 SELECT * FROM `someTable` WHERE data->'$.someData'='A' OR data->'$.someData'='B'

我不知道为什么会这样。我最初认为以 json 查询格式执行的 WHERE x IN 可能会执行类似 && 的操作,但即使值为 ('A','A') 它仍然不返回任何内容,这实际上表明更多WHERE x IN 中的一个值以上将不起作用。

样本数据(任何一个都可以)

id | data (json)
1 | {"someData":"A"}
2 | {"someData":"B"}

最佳答案

评论太长了...

这似乎与 MySQL 在 IN 表达式中只有一个值时执行的优化有关(可能将其转换为 a = b 表达式)和然后它忽略引号。严格来说,

SELECT * 
FROM `someTable`
WHERE data->'$.someData' in ('A')

SELECT * 
FROM `someTable`
WHERE data->'$.someData' = 'A'

不应该返回任何数据,因为

SELECT data->'$.someData' 
FROM someTable;

返回

"A"
"B"

这与 A 不同。您需要使用 JSON_UNQUOTE (或者如果您有 MySQL 5.7.13 或更高版本的 ->> 运算符)以获取 someData 键的实际值:

SELECT JSON_UNQUOTE(data->'$.someData') FROm someTable;
SELECT data->>'$.someData' FROm someTable;

给出

A
B

然后使用 IN 表达式可以正常工作:

SELECT * 
FROM `someTable`
WHERE JSON_UNQUOTE(data->'$.someData') in ('A','B')
-- or use WHERE data->>'$.someData' in ('A','B')

输出:

id  data
1 {"someData":"A"}
2 {"someData":"B"}

Demo on dbfiddle

关于mysql - WHERE x IN 适用于单个值,不适用于 json 上的多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55647063/

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