返回

如何使用 MEMBER OF 检查空 JSON 数组中的成员资格?

mysql

使用 MEMBER OF 检查空 JSON 数组中的成员资格

问题陈述

在 MySQL 中,MEMBER OF 运算符是一种强大的工具,可用于检查 JSON 文档中是否存在特定值。然而,在处理空 JSON 数组([])时,它却表现不佳,会导致错误的结果。

传统解决方案

为了解决此问题,传统解决方案是结合使用 JSON_ARRAY() 函数和 OR 运算符:

SELECT
    *
FROM
    `mytable`
WHERE
    tags = JSON_ARRAY()
    OR NOT 'Easy' MEMBER OF (tags -> '$[*]')

改进解决方案

虽然传统解决方案有效,但它需要额外的条件检查。我们可以使用一种更简单的查询来解决这个问题:

SELECT
    *
FROM
    `mytable`
WHERE
    tags IS NULL OR NOT 'Easy' MEMBER OF (tags -> '$[*]')

如何解决

此查询通过使用 IS NULL 条件检查 tags 列是否为空来工作。如果 tagsNULL,则该行将包含在结果集中。否则,它将使用 MEMBER OF 运算符检查 Easy 是否不是 JSON 数组的成员。

优势

改进的解决方案提供了以下好处:

  • 更简洁: 它比传统解决方案更简洁,只需一个条件检查。
  • 更有效率: 它避免了对空数组进行不必要的 MEMBER OF 检查,从而提高了查询效率。
  • 更准确: 它正确处理空 JSON 数组,返回预期的结果。

示例

以下示例演示了改进解决方案的使用:

CREATE TABLE mytable (
    id INT NOT NULL AUTO_INCREMENT,
    tags JSON DEFAULT NULL,
    PRIMARY KEY (id)
);

INSERT INTO mytable (tags) VALUES (NULL);
INSERT INTO mytable (tags) VALUES ('[]');
INSERT INTO mytable (tags) VALUES ('["Easy"]');
INSERT INTO mytable (tags) VALUES ('["Hard"]');

SELECT
    *
FROM
    mytable
WHERE
    tags IS NULL OR NOT 'Easy' MEMBER OF (tags -> '$[*]');

此查询将返回 id 为 1 和 2 的行,因为它们的 tags 列分别为 NULL[]

常见问题解答

1. 为什么 MEMBER OF 不能直接用于空 JSON 数组?

因为 MEMBER OF 检查 JSON 数组中的元素,而空数组没有元素。

2. IS NULL 条件是否会返回 NULL 值?

不会。IS NULL 条件返回 TRUEFALSE,用于检查列或表达式是否为 NULL

3. 此解决方案是否适用于其他数据库管理系统?

这取决于具体数据库管理系统。请查阅相应文档以获取更多信息。

4. 如何提高 MEMBER OF 查询的效率?

可以使用索引来提高 MEMBER OF 查询的效率。具体索引策略取决于表的结构和查询模式。

5. MEMBER OFIN 运算符有什么区别?

MEMBER OF 检查 JSON 数组中的成员资格,而 IN 检查常规值列表中的成员资格。