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

问题描述 投票:0回答:4

我正在运行

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"}
,这很好,但只是对任何空格进行健全性检查。

mysql json
4个回答
14
投票

我使用

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

这篇文章提到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           |
|---------------------|------------------|---------------------|

13
投票

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
而不需要它来进行精确搜索。

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


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

使其不区分大小写

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

0
投票

我的解决方案是这样的:

从 mytable 中选择 * WHERE LOWER(元数据->>"$.title") = lower("hello world")

© www.soinside.com 2019 - 2024. All rights reserved.