我甚至不确定如何在概念上听起来很奇怪,但我会试一试。基本上我正在寻找一种方法来创建一个本质上是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))
这甚至可能吗?如果是这样,那么正确的语法是什么?
答案 0 :(得分:4)
你可以尝试
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)
答案 1 :(得分:0)
虽然
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(因为它将在用户中每行执行一次,并且您将进行直接连接,其中必须对域中每行的用户中的每个值执行类似的方法。)
P.S。检查我的公式为子串的开始和长度(昨天是星期五晚上)。