我可以在MySQL中使用JSON_EXTRACT进行不区分大小写的搜索吗?

时间:2018-04-11 18:35:13

标签: mysql json

我正在运行SELECT * FROM mytable WHERE LOWER(JSON_EXTRACT(metadata, "$.title")) = 'hello world',意图是hello world是来自用户的数据,我将展平为全部小写。我的数据库中的实际值是" Hello World",但此搜索每次都是空的。

如果我执行SELECT LOWER(JSON_EXTRACT(metadata, "$.title")) FROM mytable,它肯定会以hello world的形式返回小写。不知道我在这里失踪了什么。

查询以获取实际值:

SELECT JSON_EXTRACT(metadata, "$.title") FROM mytable让我"Hello World"

SELECT LOWER(JSON_EXTRACT(metadata, "$.title")) FROM mytable让我"hello world"

查询试图找到合适的行

获取价值

SELECT * FROM mytable WHERE JSON_EXTRACT(metadata, "$.title") = "Hello World"

SELECT * FROM mytable WHERE metadata->"$.title" = "Hello World"

SELECT * FROM ututs WHERE LOWER(metadata->"$.title") LIKE "%hello world%"

什么都没找到

SELECT * FROM mytable WHERE JSON_EXTRACT(metadata, "$.title") = "hello world"

SELECT * FROM mytable WHERE JSON_EXTRACT(metadata, "$.title") LIKE "%hello world%"

SELECT * FROM ututs WHERE LOWER(metadata->"$.title") = "hello world"

SELECT * FROM ututs WHERE LOWER(metadata->"$.title") LIKE "hello"

所以看起来结果是回馈价值,包括报价。但这似乎不是问题,因为我在匹配案例时得到了结果。我也很困惑为什么一开始的%正在解决我的问题。 "H之间没有空格。我自己输入了JSON。

我还通过手动输入将metadata列直接更新为{"title":"Hello World"}。 MySQL会自动在冒号后面添加一个空格,使其成为{"title": "Hello World"},这很好,但只是检查任何空格。

3 个答案:

答案 0 :(得分:2)

SELECT * FROM mytable WHERE LOWER(JSON_EXTRACT(metadata, "$.title")) = JSON_QUOTE("hello world")SELECT * FROM mytable WHERE LOWER(metadata->"$.title") = JSON_QUOTE("hello world")有效,但我不确定为什么在使用JSON_QUOTE时需要使用LOWER而不需要它进行精确搜索。

如果有人能解释原因,我很乐意将其标记为答案。

答案 1 :(得分:0)

我使用like遇到了类似的区分大小写的问题。 我通过将JSON函数的输出强制转换为CHAR来解决了这个问题。

This article提到JSON函数返回utf8mb4 string。这使我相信返回的是另一种数据类型(也许是字节数组)而不是VARCHAR。这可以解释为什么不区分大小写的文本搜索失败的原因。

select
json_unquote(json_extract(json, '$.reservation.status')) as status,
json_unquote(json_extract(json, '$.reservation.status')) like '%cancelled%' as case_sensitive,
cast(json_unquote(json_extract(json, '$.reservation.status')) as CHAR) like '%cancelled%' as case_insensitive
from myTable

此查询的输出是:

|---------------------|------------------|---------------------|
|        status       |  case_sensitive  |  case_insensitive   |
|---------------------|------------------|---------------------|
|      Cancelled      |        0         |         1           |
|---------------------|------------------|---------------------|
|        New          |        0         |         0           |
|---------------------|------------------|---------------------|

答案 2 :(得分:0)

使用column->>path获取数据:

SELECT * FROM mytable 
WHERE JSON_UNQUOTE(JSON_EXTRACT(metadata, "$.title")) LIKE  "%hello world%"

OR

SELECT * FROM mytable 
WHERE metadata->>"$.title" LIKE  "%hello world%"