1

在 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"}
4

2 回答 2

5

评论太长了……

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

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"}

dbfiddle 上的演示

于 2019-04-12T09:05:20.117 回答
0

您可以尝试在子查询上使用联接而不是 IN 子句

SELECT * 
FROM `someTable` s 
INNER JOIN (
   select 'A'  col
   union 
   select 'B'
 )  t ON t.col = s.data->'$.someData 
于 2019-04-12T09:08:40.947 回答