【问题标题】:Need to UPPER SQL statement with INNER JOIN SELECT需要使用 INNER JOIN SELECT UPPER SQL 语句
【发布时间】:2013-08-05 21:23:15
【问题描述】:

我正在使用 Pervasive SQL 10.3(我们称之为 MS SQL,因为几乎所有的语法都相同)并且我有一个查询以使用他们的电子邮件地址作为重复键来查找重复的客户:

SELECT arcus.idcust, arcus.email2
     FROM arcus 
          INNER JOIN (
               SELECT arcus.email2, COUNT(*) 
                    FROM arcus WHERE RTRIM(arcus.email2) != '' 
                         GROUP BY arcus.email2 HAVING COUNT(*)>1
          ) dt 
     ON arcus.email2=dt.email2
          ORDER BY arcus.email2";

我的问题是我需要在 email2 字段上进行不区分大小写的搜索。我需要 UPPER() 来转换这些字段。

我对如何在此查询中执行 UPPER() 有点困惑。我尝试了各种组合,包括我认为肯定会起作用的组合:

 ... ON UPPER(arcus.email2)=UPPER(dt.email2) ...

...但这没有用。它认为它是一个有效的查询,但它运行了很长时间,我最终放弃并停止了它。

知道如何在 email2 字段上进行 UPPER 转换吗?

谢谢!

【问题讨论】:

    标签: sql select inner-join


    【解决方案1】:

    如果您的数据库设置为区分大小写,那么您的内部查询必须考虑到这一点才能按您的预期执行分组。如果不区分大小写,则不需要 UPPER 函数。

    假设您的数据库区分大小写,您可以尝试以下查询。也许这会运行得更快...

    SELECT arcus.idcust, arcus.email2
     FROM arcus 
          INNER JOIN (
               SELECT UPPER(arcus.email2) as upperEmail2, COUNT(*) 
                    FROM arcus WHERE RTRIM(arcus.email2) != '' 
                         GROUP BY UPPER(arcus.email2) HAVING COUNT(*)>1
          ) dt 
     ON UPPER(arcus.email2) = dt.upperEmail2          
    

    【讨论】:

    • 这在合理的时间内成功了!出于某种原因,我认为我必须在 arcus.email2 上的第一个 SELECT 上执行 UPPER(),但显然情况并非如此。赞一个!
    【解决方案2】:

    查看this blog post,它讨论了 SQL 中不区分大小写的搜索。从本质上讲,它之所以这么慢,是因为查询中很可能没有一个当前表索引可以使用,因此数据库引擎必须执行一次全表扫描,可能会执行多次。

    arcus.email2 上的索引在想要比较大写版本 (UPPER(arcus.email2)) 时完全没用,因为数据库引擎无法查找索引中的值(因为它们是不同的值!)。

    为了提高性能,您可以专门针对将UPPER 应用于字段的结果创建索引。

    CREATE INDEX IX_arcus_UPPER_email2
        ON arcus (UPPER(email2));
    

    【讨论】:

      【解决方案3】:

      字符串的排序规则将决定 SQL Server 如何比较字符串。如果您使用不区分大小写的格式存储数据,那么在比较字符串“AAAA”和“aaaa”时,它们将相等。您可以在 where 子句中为您的电子邮件列放置一个整理 Latin1_General_CI_AS。

      查看下面的链接,了解如何在 sql 查询中实现排序规则。

      How to do a case sensitive search in WHERE clause

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2012-04-05
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 2018-04-29
        相关资源
        最近更新 更多