WHERE x IN使用单个值,而不使用json上的多个

Ret*_*n-1 1 mysql where where-in mysql-json

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

以下查询工作正常

SELECT * FROM `someTable` WHERE data->'$.someData' in ('A')
Run Code Online (Sandbox Code Playgroud)

但是,以下内容不返回任何内容。

 SELECT * FROM `someTable` WHERE data->'$.someData' in ('A','B')
Run Code Online (Sandbox Code Playgroud)

有趣的是,这也起作用:

 SELECT * FROM `someTable` WHERE data->'$.someData'='A' OR data->'$.someData'='B'
Run Code Online (Sandbox Code Playgroud)

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

样本数据(任何人都可以做)

id | data (json)
1  | {"someData":"A"}
2  | {"someData":"B"}
Run Code Online (Sandbox Code Playgroud)

Nic*_*ick 5

评论太久了...

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

SELECT * 
FROM `someTable` 
WHERE data->'$.someData' in ('A')
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * 
FROM `someTable` 
WHERE data->'$.someData' = 'A'
Run Code Online (Sandbox Code Playgroud)

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

SELECT data->'$.someData' 
FROM someTable;
Run Code Online (Sandbox Code Playgroud)

退货

"A"
"B"
Run Code Online (Sandbox Code Playgroud)

这与A。您需要使用JSON_UNQUOTE(或如果您拥有MySQL 5.7.13或更高版本的->>运算符)来获取someData密钥的实际值:

SELECT JSON_UNQUOTE(data->'$.someData') FROm someTable;
SELECT data->>'$.someData' FROm someTable;
Run Code Online (Sandbox Code Playgroud)

这使

A
B
Run Code Online (Sandbox Code Playgroud)

然后可以与IN表达式配合使用:

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

输出:

id  data
1   {"someData":"A"}
2   {"someData":"B"}
Run Code Online (Sandbox Code Playgroud)

dbfiddle上的演示