С помощью SQL вы можете использовать подзапрос в предложении WHERE LIKE? - PullRequest
3 голосов
/ 27 марта 2010

Я даже не уверен, как это сформулировать, поскольку это звучит странно концептуально, но я попробую. По сути, я ищу способ создания запроса, который по сути является оператором WHERE IN LIKE SELECT.

Например, если бы я хотел найти все записи пользователя с адресом электронной почты hotmail.com, я мог бы сделать что-то вроде:

SELECT UserEmail 
FROM Users 
WHERE (UserEmail LIKE '%hotmail.com')

Но что, если я хочу использовать подзапрос в качестве критерия соответствия? Как то так:

SELECT UserEmail 
FROM Users 
WHERE (UserEmail LIKE (SELECT '%'+ Domain FROM Domains))

Это вообще возможно? Если да, то каков правильный синтаксис?

Ответы [ 2 ]

4 голосов
/ 27 марта 2010

Вы можете попробовать

SELECT  u.*
FROM    Users u INNER JOIN
        Domains d ON u.UserEmail LIKE '%'+ d.Domain

Или даже попробовать

SELECT  u.*
FROM    Users u
WHERE   EXISTS(SELECT 1 FROM Domains d WHERE u.UserEmail LIKE '%' + d.Domain)
0 голосов
/ 27 марта 2010

Хотя

SELECT  u.UserMail
FROM    Users u
WHERE   EXISTS(SELECT 1 FROM Domains d WHERE u.UserEmail LIKE '%' + d.Domain)

даст то, что вы ищете, пожалуйста, поймите, что подобное дорого, и что вы могли бы побриться немного времени с (mysql диалект):

SELECT  u.UserMail
FROM    Users u
WHERE   SUBSTRING_INDEX(u.UserMail, '@', -1) IN (SELECT d.Domain FROM Domains)

или даже

SELECT  u.UserMail
FROM    Users u
        INNER JOIN Domains d ON SUBSTRING_INDEX(u.UserMail, '@', -1) = d.Domain

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

РЕДАКТИРОВАТЬ: я пропустил тег сервера MS SQL. Для этого диалекта

substring(UserMail, charindex('@', UserMail) + 1, len(UserMail) - charindex('@', UserMail) )

должен превосходить LIKE (потому что он будет выполняться один раз для каждой строки в Users, и вы получите прямое соединение, где аналогичный подход должен быть выполнен для каждого значения в Users в каждой строке в Domains).

P.S. проверьте мои формулы для начала и длины в подстроке (это было вчера вечером в пятницу).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...