【问题标题】:Json search for arbitrary fieldsJson搜索任意字段
【发布时间】:2017-10-14 20:22:21
【问题描述】:

我正在使用 MySql+Python。我有一个带有 json 字段的 MySql 表。用户可以在 json 对象中存储任意数量的字段。

例如:

{id:12, name:"a", age: 23}
OR
{id:5, distance: 23, distance_unit: "mile"}

以下查询效果很好:

SELECT  JSON_EXTRACT(name, "$.id") as name
 FROM table
 WHERE JSON_EXTRACT(name, "$.id") > 3

但是,只有当我事先知道字段名称时,它才会起作用。有没有办法搜索任意字段?比如:

def search(json_field)
    magic!!!
    if (json_field==exist)
        return json_value
    else:
        return "not found"

我不想将所有结果加载到内存中,然后使用 Python 进行搜索,因为它效率不高。

【问题讨论】:

    标签: python mysql json


    【解决方案1】:

    也许您希望通过 value 搜索 JSON 数据,而不必知道它的 key(即字段)?

    如果是这样,您可以尝试JSON_SEARCH 功能。如果找到匹配值,则返回键名(字段名),否则返回 NULL。该函数的第二个参数决定是要对所有 JSON 字段进行搜索还是以第一个匹配结束。

    示例:

    CREATE TABLE temp1(mydata json);
    INSERT INTO temp1 values('{"id":"5", "distance":"23", "age":"23", "distance_unit":"mile"}');
    
    
    SELECT json_search(mydata, "one", "5") AS success FROM temp1;  
    -- Returns "$.id"
    
    
    
    SELECT json_search(mydata, "all", "23") AS success FROM temp1;
    -- Returns ["$.age", "$.distance"]
    
    
    
    SELECT json_search(mydata, "all", "99") AS success FROM temp1;
    -- Returns NULL
    

    Demo

    然后您也许可以检查 Python 代码中查询返回的值是否为 None

    【讨论】:

    • 感谢您的回复。我不是按价值搜索。可能有几十个可能匹配的值。我想知道 json 对象中是否存在一个键,如果是,那么它的值是什么。
    • 我认为在这种情况下JSON_EXTRACT 完全符合您的要求。例如,请看一下这个link。使用的查询是SELECT TRIM(BOTH '"' FROM json_extract(mydata, '$."id"')) AS test_field FROM temp1 - 它返回5。当查询更改为SELECT TRIM(BOTH '"' FROM json_extract(mydata, '$."id1"')) AS test_field FROM temp1(一个不存在的键)时,它返回NULL,可以再次在Python代码中检查。你怎么看?
    • 很高兴知道! :)
    • 查询不适用于嵌套的 json 对象 :( 例如,查看链接:rextester.com/VQKV1140 我应该知道嵌套字段的路径和级别。查询返回 null 的“名称”,因为我没有提供正确的路径。
    • 嗨@Momi,如果您知道级别,那么拥有它实际上是一件好事!查询可以稍作修改。例如,请查看this link。如果您知道name 处于第二级,那么您将使用json_extract(mydata, '$.*."name"')。同样,如果您知道它在第三层,那么路径将相对于json_extract(mydata, '$.*.*."name"') 发生变化。但请记住,如果您的级别公式未在其下不包含任何嵌套级别的点结束,则将返回该级别的剩余 JSON 字符串。
    猜你喜欢
    • 2017-08-31
    • 2018-07-13
    • 2021-07-20
    • 1970-01-01
    • 2014-10-10
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多