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

标签 mysql in-clause

有没有一种方法可以检查同一个 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       |
+----+--------------+---------------+-------------+

假设我想要所有名字、中间名或姓氏为 Daniel 或 Peter 的员工 - 因此,我想要 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被解释为 bool 值。

最佳答案

从 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)

关于MySQL - 检查同一 IN 子句中是否有多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36765382/

相关文章:

php - 如果登录时间大于表中的1,如何计算总工作时间

MySql逻辑优化

java - 带有 IN 子句中参数列表的 PreparedStatement

java - 带有 Spring Data JPA @Query 注释的 IN 子句错误

mysql - 从现有表语句调试 MySQL CREATE TABLE?

mysql - 确定mysql中两个字段的唯一组合的计数

php - 如何将 MySQL 中数字列单元格的值减一?

mysql - 允许使用 IN 子句重复记录

sql - ORACLE UPPER 应用于 IN 条件

Oracle - 在使用多个值时的 CLAUSE 问题中,使其动态化