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

时间:2016-04-21 09:28:06

标签: 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       |
+----+--------------+---------------+-------------+

说我想要所有员工,无论是名字还是姓名中的名字都是丹尼尔或彼得 - 因此,我想要ids 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被解释为布尔值。

2 个答案:

答案 0 :(得分:0)

正如我现在没有其他方法可以更快地执行它。无论如何,在最坏的情况下,你必须将每个名字,姓名和姓氏进行比较。

你也可以将推荐的Imran Ali连接起来的名字,中间名和姓,但是...... 1.它不安全。例如,当名字的结尾和中间名的开头是你的一些名字时,你可以匹配。 它会执行更长时间。当你检查相等时,系统在第一次不相等之后中断比较字符,但是当你检查入口时,系统也必须比较所有后续字符。

答案 1 :(得分:0)

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