2016-04-21 1 views
0
.

. Есть ли способ проверить, существуют ли несколько значений в одном и том же разделе, без переписывания того же предложения 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  | 
+----+--------------+---------------+-------------+ 

Скажем, я хочу, чтобы все сотрудников Whos первый, средний или фамилия либо Даниэль или Питер - таким образом, я хочу идентификаторами 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

Вы можете повернуть его вокруг 'где 'Daniel' в() или 'Питер' в()' –

+0

@ lan2thedv как о конкатенации 'first_name, middle_name' и' 'last_name' в fullname', а затем выполнить запрос для 'substrings' на' fullname', это упростит запрос? –

+0

@juergend да, но все равно потребуются два предложения, что я и стараюсь избегать – Ian2thedv

ответ

0

Как я сейчас, это не лучший способ выполнить его быстрее. В любом случае, в худшем случае вам нужно сравнить каждое из первых, средних и фамилий с вашим массивом имен.

Вы также можете соединить имя, отчество и фамилию в соответствии с рекомендациями Имрана Али, но .. 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. У вас репутация почти в 16 тыс., И ваш ответ был отмечен как низкое качество. Вы должны знать, что это хорошая вещь, чтобы предоставить дополнительную информацию о ваших ответах, а не простой код :) – Phiter

+1

Я снова чувствую себя рожденным – Strawberry

Смежные вопросы