使用 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:为啥我必须引用数字?