【问题标题】:With SQL can you use a sub-query in a WHERE LIKE clause?使用 SQL,您可以在 WHERE LIKE 子句中使用子查询吗?
【发布时间】:2023-03-13 01:18:01
【问题描述】:

我什至不知道如何表达这句话,因为这在概念上听起来很奇怪,但我会试一试。基本上,我正在寻找一种方法来创建本质上是 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))

这可能吗?如果是这样,正确的语法是什么?

【问题讨论】:

    标签: sql database sql-server-2005 tsql


    【解决方案1】:

    你可以试试

    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)
    

    【讨论】:

    • 有了这个你会得到行重复N次取决于从右表找到多少记录。
    • 这取决于右表是否多次包含同一个域,使用 DISTINCT 子选择可以避免这种情况。
    • @zerkms,我添加了第二个选项供 OP 评估。希望能解决问题 X-)
    • 啊,你写的和我在同一时间写的一样 %) 所以我要删除然后回 +1 ;-)
    【解决方案2】:

    虽然

    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(因为它将在用户中的每行执行一次,并且您可以直接加入,其中必须对域中每一行的用户中的每个值执行类似的方法)。

    附:检查我的子字符串中的开始和长度公式(昨天是星期五晚上)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2011-11-29
      • 1970-01-01
      • 2013-06-20
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多