使用SQL,您可以在WHERE LIKE子句中使用子查询吗?

时间:2010-03-27 10:14:16

标签: sql database sql-server-2005 tsql

我甚至不确定如何在概念上听起来很奇怪,但我会试一试。基本上我正在寻找一种方法来创建一个本质上是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 个答案:

答案 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。检查我的公式为子串的开始和长度(昨天是星期五晚上)。