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)
评论太久了...
当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)
归档时间: |
|
查看次数: |
46 次 |
最近记录: |