sql как запрос полного имени из трех столбцов - PullRequest
2 голосов
/ 26 марта 2012

У меня есть текстовое поле, которое принимает в качестве примера полное имя: Майкл Питер Джонсон в моей таблице у меня есть три столбца firstName, middlename и фамилия Я написал этот запрос, но он возвращает пустой

SELECT firstName,middleName,lastName
FROM staff
WHERE firstName LIKE "%michael peter johnson%"
OR middleName LIKE "%michael peter johnson%"
OR lastName LIKE "%michael peter johnson%" 

если пользователь вводит сына, он должен отображать Майкла Питера Джонсона, так как сын содержится в Джонсоне.

спасибо моя таблица: firstName имеет (Майкл) middleName имеет (Питер) lastName (Джонсон)

Ответы [ 6 ]

9 голосов
/ 26 марта 2012

Если я правильно понимаю, в настоящее время он работает для частей имени / среднего имени / фамилии, но не для ввода полного имени.

Чтобы это исправить, вы можете использовать concat, поэтому он всегда будет работать:

select firstName,middleName,lastName 
from staff 
where concat(firstName, ' ', middlename, ' ', lastname) Like "%michael peter johnson%"
4 голосов
/ 26 марта 2012

Вы проверяете наличие любой строки, включающей все из michael peter johnson.

Вам нужно три отдельных утверждения, с разными сравнениями ...

WHERE
   firstName  Like '%michael%'
or middleName Like '%peter%'
or lastName   Like '%johnson%"

Вы могли бы изменить логику ...

WHERE
   'michael peter johnson' LIKE '%' + firstName  +'%'
or 'michael peter johnson' LIKE '%' + middleName +'%'
or 'michael peter johnson' LIKE '%' + lastName   +'%'


Вы также привели пример, где поиск для 'son'. Ваш существующий код будет работать для этого. Это просто «проблема», когда вы сравниваете каждую отдельную часть имени с параметром, который имеет все имя.

Так, может быть, вы хотите обе версии вместе?

WHERE
   'michael peter johnson' LIKE '%' + firstName  +'%'
or 'michael peter johnson' LIKE '%' + middleName +'%'
or 'michael peter johnson' LIKE '%' + lastName   +'%'
or firstName  LIKE '%' + 'michael peter johnson' + '%'
or middelName LIKE '%' + 'michael peter johnson' + '%'
or lastName   LIKE '%' + 'michael peter johnson' + '%'

Вам просто нужно решить, какое именно поведение вы хотите, и затем проработать его.

1 голос
/ 26 марта 2012

В sql:

firstName Like "%michael peter johnson%"

Означает, что имя может начинаться с любого символа, тогда в нем должна быть строка "michael peter johnson", а последний% означает, что он может заканчиваться любым символом. Если вы хотите найти Джонсона с сыном в качестве входных данных, ваш тест должен быть

select firstName,middleName,lastName 
from staff 
where firstName Like "%son%" 
  or middleName Like "%son%" 
  or lastName Like "%son%"

Или с регулярным выражением:

select firstName,middleName,lastName 
from staff 
where firstName REGEXP ".*son.*" 
  or middleName REGEXP ".*son.*" 
  or lastName REGEXP ".*son.*"
1 голос
/ 26 марта 2012

Вы хотите что-то вроде этого:

SELECT * FROM mytable
 WHERE CONCAT(firstName, ' ', middleName, ' ', lastName) LIKE '%son%'

Это объединит все поля имени в одно полное имя.

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

0 голосов
/ 26 марта 2012

Вы можете использовать функцию concat в своем запросе:

select firstName,middleName,lastName from staff where CONCAT(firstName,middleName,lastName) like ('%johnson%');
0 голосов
/ 26 марта 2012

На самом деле ваш запрос должен выглядеть следующим образом:

where CONCAT("%",firstName,"%") Like "michael peter johnson" 
or CONCAT("%",middleName,"%") Like "michael peter johnson" 
or CONCAT("%",lastName,"%") Like "michael peter johnson" 

Причина в том, что LIKE сопоставляет% с любым количеством символов, но не удаляет символы - например, "test" соответствует "%es%" но не "%atesta%".Надеюсь, это поможет.

...