【问题标题】:mysql - Search for a key within inconsistent json structuremysql - 在不一致的 json 结构中搜索键
【发布时间】:2020-11-05 09:20:27
【问题描述】:

我知道函数如:JSON_SEARCH()JSON_EXTRACT() 等。这个问题是我在一个非标准化的 json 字符串中搜索一个键。例如:

SELECT
    *
FROM
    users

结果可能是这样的:

+---------------------------------------------+
| name | last | data                          |
+------+------+-------------------------------+
| john | doe  | {"acctNum": "123"}            |
+------+------+-------------------------------+
| john | doe  | {"data":{ "acctNum": "123" }} |
+------+------+-------------------------------+
| jane | doe  | {"data":{ "acctNum": "1234" }}|
+------+------+-------------------------------+

所以在这个例子中,我想得到 john doe,acctNum 为 123。但是,acctNum 键的位置也不同。我见过here,您可以使用:JSON_SEARCH(data, $**.acctNum),但我得到空结果,

在一个理想的世界里,我想要的是:

SELECT * FROM users WHERE JSON_EXTRACT(data, "$**.acctNum") = 123

并接收

+---------------------------------------------+
| name | last | data                          |
+------+------+-------------------------------+
| john | doe  | {"acctNum": "123"}            |
+------+------+-------------------------------+
| john | doe  | {"data":{ "acctNum": "123" }} |
+------+------+-------------------------------+

另外,在上面的链接中找到键 acctNum 可能是非常嵌套的。

我曾尝试将正则表达式与 SELECT * FROM users WHERE data REGEXP '123'; 一起使用,但正如您所想象的那样,用户 jane doe 也将被匹配

【问题讨论】:

    标签: mysql sql json


    【解决方案1】:

    在任意路径搜索定义的值:

    SELECT *
    FROM users
    WHERE JSON_SEARCH(data, 'one', 123);
    

    在定义的路径搜索定义的值:

    SELECT *
    FROM users
    WHERE JSON_SEARCH(data, 'one', 123) = '$.acctNum'; -- or '$.data.acctNum'
    

    在任意路径搜索已定义的属性名称和值:

    SELECT *
    FROM users
    WHERE JSON_SEARCH(data, 'all', 123) LIKE '%.acctNum"%';
    

    fiddle

    【讨论】:

    • 感谢您的快速回复。最初我有第一个解决方案,但是没有找到。当我知道有 4 个条目时,仍然返回一个空集。在您更新问题后,对我有用的是第三个使用 LIKE '%.acctNum"%' 的问题,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-12-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多