#sql #sql-server
#sql #sql-сервер
Вопрос:
Получите все Users
из первой таблицы, у которых есть какое-либо совпадение слов в другой таблице;
У меня есть Users
таблица, которая содержит, среди прочего, столбец с FullName
, этот столбец Full Text Search
проиндексирован. Иногда первым «словом» является имя, иногда первым «словом» является фамилия из FullName
столбца;
Например, John Smith или Smith John.
И другая таблица, у которой есть только локальное имя.
Я хочу получить всех пользователей, у которых есть соответствующее локальное имя.
Users Table:
John Smith
Rebecca Mark
Maria Anna
Lance Maria
Emilia Clark
Snow John
Natalie Butler
Name Table:
Maria
Smith
Result of Query:
John Smith
Maria Anna
Lance Maria
Snow John
Я могу использовать только одно имя с функцией Contains.
SELECT * FROM Users WHERE CONTAINS(FullName, 'John');
Но мне это нужно для каждой строки в Name Table
.
Каждая строка из FullName
содержит любую из имен Table… Но в SQL-запросе.
Комментарии:
1. Вы можете выполнить внутреннее объединение, используя оператор like для имени
Ответ №1:
Чтобы избежать случая, когда вы выполняете поиск 'Maria'
и совпадающее имя является 'Marianne'
,
проверьте выполнение 2 условий: (1) имя находится в начале или (2) в конце FullName
:
(1):
SELECT u.*
FROM Users u INNER JOIN Name n
ON
u.FullName LIKE concat(n.name, ' %')
OR
u.FullName LIKE concat('% ', n.name)
или (2):
SELECT u.*
FROM Users u INNER JOIN Name n
ON
concat(' ', u.FullName, ' ') LIKE concat('% ', n.name, ' %')
Ответ №2:
используйте join и like для сопоставления
select u.* from table_users u join table_name b on
u.users like concat('%',b.name,'%')
Ответ №3:
Вы можете использовать exists
для этого:
select u.*
from users u
where exists (select 1
from nametable n
where u.fullname like '%' n.name '%'
);
Если вы хотите избежать частичных совпадений по именам, то примите во внимание разделители:
where exists (select 1
from nametable n
where ' ' u.fullname ' ' like '% ' n.name ' %'
);
Комментарии:
1. Проблема в том, что John совпадает с Johnson
2. Я могу взломать это с помощью одного оператора or с пробелами в начале ИЛИ в конце word. Вот так: ‘%’ n.name Или n.name ‘ %’.
3. Спасибо. Это работает хорошо, я должен принять первый рабочий ответ. Вверх. Вы получите upvote. 😉