MySQL - 检查同一 IN 子句中是否有多个值



有没有办法检查同一个in子句中是否存在多个值,而无需重写相同的IN子句?

Employee Table:
+----+--------------+---------------+-------------+
| id |  first_name  |  middle_name  |  last_name  |
+----+--------------+---------------+-------------+
| 1  |     Ian      |    Daniel     | de Villiers |
| 2  |     Karien   |               | Tolmie      |
| 3  |     John     |    Peter      | Green       |
| 4  |     Daniel   |    Silie      | von Guns    |
| 5  |     Francois |    Roos       | Krans       |
+----+--------------+---------------+-------------+

假设我想要所有名字、中间名或姓氏是丹尼尔或彼得的员工 - 因此,我想要 ID 1、3 和 4。

我知道该怎么做的唯一方法是:

SELECT id 
FROM   employees 
WHERE  ( first_name IN ( "Daniel", "Peter" ) ) 
        OR ( middle_name IN ( "Daniel", "Peter" ) ) 
        OR ( last_name IN ( "Daniel", "Peter" ) ) 

如果我有多个值要测试或在 IN 子句中有过多的值,这可能会很长。

我试过了

SELECT id 
FROM   employees 
WHERE  ( first_name OR middle_name OR last_name IN ( "Daniel", "Peter" ) ) 

但我认为这会导致first_name被解释为布尔值。

从 MySQL 8.0 开始,您可以使用 JSON_OVERLAPS() 来比较使用 JSON_ARRAY() 创建的两个 JSON 文档。如果两个文档有任何共同的键值对或数组元素,则这样做将返回 true。

如果两个参数都是标量,则该函数将执行简单的相等性测试。

因此,引用的代码将类似于:

SELECT
    `id` 
FROM
    `employees` 
WHERE
    JSON_OVERLAPS (
        JSON_ARRAY( "Daniel", "Peter" ),
        JSON_ARRAY( `first_name`, `middle_name`, `last_name` )
    );

具体来说,它指出,在比较两个数组时,JSON_OVERLAPS()如果它们共享一个或多个共同的数组元素,则返回 true,如果它们不共享,则返回 false:

mysql> SELECT JSON_OVERLAPS(JSON_ARRAY("Daniel", "Peter"), JSON_ARRAY("Ian", "Daniel", "de Villiers"));
+---------------------------------------+
| JSON_OVERLAPS(JSON_ARRAY("Daniel", "Peter"), JSON_ARRAY("Ian", "Daniel", "de Villiers")) |
+---------------------------------------+
|                                     1 |
+---------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT JSON_OVERLAPS(JSON_ARRAY("Daniel", "Peter"), JSON_ARRAY("John", "Peter", "Green"));
+---------------------------------------+
| JSON_OVERLAPS(JSON_ARRAY("Daniel", "Peter"), JSON_ARRAY("John", "Peter", "Green")) |
+---------------------------------------+
|                                     1 |
+---------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT JSON_OVERLAPS(JSON_ARRAY("Daniel", "Peter"), JSON_ARRAY("Francois", "Roos", "Krans"));
+---------------------------------------+
| JSON_OVERLAPS(JSON_ARRAY("Daniel", "Peter"), JSON_ARRAY("Francois", "Roos", "Krans")) |
+---------------------------------------+
|                                     0 |
+---------------------------------------+
1 row in set (0.00 sec)

就像我现在一样,没有其他方法可以更快地执行它。无论如何,在最坏的情况下,您必须将每个名字,中间名和姓氏与您的名称数组进行比较。

您也可以按照建议连接名字,中间名和姓氏 伊姆兰·阿里,但是..1.不安全。例如,当名字的结尾和中间名的开头构成您的一些名字时,您可以进行匹配。2.它将执行更长时间。当您检查相等性时,系统会在第一个不相等的字符之后中断比较字符,但是当您检查入口时,系统也必须比较所有后续字符。

SELECT * 
  FROM employee 
 WHERE 1 IN('daniel' IN (first_name,middle_name,last_name),'peter' IN (first_name,middle_name,last_name));

相关内容

  • 没有找到相关文章

最新更新