【问题标题】:MySQL where JSON contains empty arrayJSON包含空数组的MySQL
【发布时间】:2019-07-03 03:01:08
【问题描述】:

如何在 JSON 列中搜索空数组?

假设我有一个 config 列,它的 JSON 有时等于 {"tier": []}

WHERE JSON_CONTAINS(config, '', '$.tier') = 1

WHERE JSON_CONTAINS_PATH(config, 'one', '$.tier') = NULL

没有返回任何结果。 我有什么遗漏吗?

我专门四处寻找答案,但在 SO 或 MySQL 文档上找不到任何内容。

【问题讨论】:

    标签: mysql sql json


    【解决方案1】:

    这里有两种方法,在 MySQL 5.7.24 上测试:

    mysql 5.7.24> select config from mytable 
      where json_contains(config, cast('[]' as json), '$.tier');
    +--------------+
    | config       |
    +--------------+
    | {"tier": []} |
    +--------------+
    
    mysql 5.7.24> select config from mytable 
      where json_contains_path(config, 'one', '$.tier');
    +--------------+
    | config       |
    +--------------+
    | {"tier": []} |
    +--------------+
    

    我找到了另一个解决方案,它有助于严格检查空数组:

    首先,看到我有两行,其中一个有一个非空数组:

    mysql 5.7.24> select config from mytable 
      where json_contains(config, json_array(), '$.tier');
    +----------------------------------------+
    | config                                 |
    +----------------------------------------+
    | {"tier": []}                           |
    | {"tier": [{"name": "BK", "value": 8}]} |
    +----------------------------------------+
    2 rows in set (0.00 sec)
    

    现在我确保数组的长度为 0,以此来确认它是空的:

    mysql 5.7.24> select config from mytable 
      where json_contains(config, json_array(), '$.tier') 
      and json_length(config, '$.tier') = 0; 
    +--------------+
    | config       |
    +--------------+
    | {"tier": []} |
    +--------------+
    1 row in set (0.00 sec)
    

    【讨论】:

    • 嗯。有没有办法进行某种严格的检查?如果我的config 列还包含{"tier": [{"name": "BK", "value": 8}]},那么这些记录以及空数组记录都会显示在结果中。
    【解决方案2】:

    如果保证tier 是一个数组,您可以使用JSON_CONTAINS_PATH 检查第0 项是否存在:

    SELECT JSON_CONTAINS_PATH('{"tier": []}',             'one', '$.tier[0]'); -- 0
    SELECT JSON_CONTAINS_PATH('{"tier": ["foo"]}',        'one', '$.tier[0]'); -- 1
    SELECT JSON_CONTAINS_PATH('{"tier": ["foo", "bar"]}', 'one', '$.tier[0]'); -- 1
    

    交替使用JSON_LENGTH:

    SELECT JSON_LENGTH('{"tier": []}',             '$.tier'); -- 0
    SELECT JSON_LENGTH('{"tier": ["foo"]}',        '$.tier'); -- 1
    SELECT JSON_LENGTH('{"tier": ["foo", "bar"]}', '$.tier'); -- 2
    

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多