2016-04-21 61 views
0

有沒有辦法檢查同一個in子句中是否存在多個值,而不重寫相同的IN子句?MySQL - 檢查同一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被解釋爲一個布爾值。

+1

你可以把它周圍的'其中 '丹尼爾'()或 '彼得' 在()' –

+0

@ lan2thedv如何有關串聯'FIRST_NAME,middle_name'和'last_name'成'fullname',然後查詢'fullname'上的'substrings',這會簡化查詢嗎? –

+0

@juergend是的,但仍然需要兩個子句,這是我想要避免 – Ian2thedv

回答

0

正如我現在沒有其他方式來執行它更快。無論如何,在最壞的情況下,你必須將你的名字,姓名和中間名與你的名字進行比較。

您也可以連接第一個,中間和最後一個名字作爲推薦的Imran Ali,但是.. 1.它不安全。例如,當名字的結尾和中間名的開頭正在製作一些你的名字時,你可以匹配。 2.它會執行更長時間。當你檢查相等性時,系統在第一次不相等時會中斷比較字符,但是當你檢查入口時,系統也必須比較所有後面的字符。

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

嗨,@Strawberry。你有近16k的聲譽,你的答案被標記爲低質量。你應該知道,提供關於你的答案的額外信息是一件好事,而不是一個簡單的代碼:) – Phiter

+1

我覺得重生 – Strawberry