有没有办法检查同一个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));