2

我正在使用 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 转换吗?

谢谢!

4

3 回答 3

3

如果您的数据库设置为区分大小写,那么您的内部查询必须考虑到这一点才能按照您的预期执行分组。如果它不区分大小写,则不需要 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          
于 2013-08-05T22:11:56.963 回答
0

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

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

如何在 WHERE 子句中进行区分大小写的搜索

于 2013-08-05T21:31:29.237 回答
0

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

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

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

CREATE INDEX IX_arcus_UPPER_email2
    ON arcus (UPPER(email2));
于 2013-08-05T21:39:01.440 回答