使用 MySQL Json_search 函数使用不区分大小写的搜索获取 JSON 数据中值的路径表达式

Posted

技术标签:

【中文标题】使用 MySQL Json_search 函数使用不区分大小写的搜索获取 JSON 数据中值的路径表达式【英文标题】:Get path expression of a value inside JSON data using case insensitive search using MySQL Json_search function 【发布时间】:2019-03-30 00:46:48 【问题描述】:

我有一个要求,我需要从 JSON 数据中提取 JSON 路径表达式,按值搜索。

例如,如果我将 JSON 数据存储为

SET @j = '["name":"Kiran Muralee", "age" : 30 , "Salary" : 30000,
      "Name":"Arun Babu", "age" : 35 , "Salary" : 60000]';

如果我需要获取价值的 JSON 路径 'Arun Babu' 我可以使用

SELECT JSON_SEARCH(@j, 'all', 'Arun Babu');

这会导致

"$[1].Name"

这是对的,但问题是如果我使用值 'arun babu' 进行搜索,它会返回 NULL。所以我使用了不区分大小写的搜索

SELECT JSON_SEARCH(lower(@j), 'all', lower('arun babu'));

所以现在我得到的结果是

"$[1].name"

但这不是我需要的,因为现在结果也以小写形式输出,我需要结果是 “$[1].名称” 谁能提出一个好的解决方案或方法。

使用的 mysql 版本是 5.7(支持 JSON 类型的版本)

【问题讨论】:

我认为您需要在应用程序代码(例如:php)中以不区分大小写的方式使用来自 json_search 的结果键;使用相同的方法 (strtolower()) @MadhurBhaiya 但为此我需要将所有长 JSON 数据带入应用程序端(PHP)不是。是否可以使用 MySQL 查询本身来实现,并且只将结果返回到应用程序中。对不起,如果我弄错了您的评论。 不,我不建议将完整的 JSON 带到应用程序端。只需获取结果(此处为键),并在 PHP 代码中以不区分大小写的方式使用它们。 @MadhurBhaiya 好的,但结果已经不区分大小写了。如果 JSON 中有另一个键,例如 nAMe,该怎么办。键 'Name' 和 'nAMe' 不一样,包含不同的值。所以再次如果需要在键'Name'中提取值,这是不可能的。 @MadhurBhaiya 你的意思是只使用不区分大小写的搜索的键(可能带有值)并在应用程序端进行小过滤以找出正确的键以供以后使用 【参考方案1】:

我们可以通过使用不区分大小写的排序规则得到预期的解决方案:

SELECT JSON_SEARCH(@j , 'all', 'arun babu' COLLATE utf8mb4_general_ci);

db-fiddle

【讨论】:

以上是关于使用 MySQL Json_search 函数使用不区分大小写的搜索获取 JSON 数据中值的路径表达式的主要内容,如果未能解决你的问题,请参考以下文章

使用 mysql JSON_SEARCH:为啥我必须引用数字?

MYSQL 触发器:JSON_SEARCH 整数 json 数组中的整数值

MySQL 中的 JSON_SEARCH

Mysql中的JSON函数使用教程

MySQL - 搜索 JSON 数据列

MySQL数据库基础:JSON函数各类操作一文详解