2013-08-05 88 views
2

我使用的普適SQL 10.3(我們叫它MS SQL,因爲幾乎所有的東西是一樣的關於語法),我有一個查詢中使用他們的電子郵件地址作爲查找重複的客戶重複密鑰:需要與內部上方的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領域上轉換任何想法?

謝謝!

回答

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   
+0

這樣做了,在合理的時間!出於某種原因,我認爲我必須在arcus.email2上的第一個SELECT上執行UPPER(),但顯然情況並非如此。 Kudos! –

0

字符串的排序規則將決定SQL Server如何比較字符串。如果您使用不區分大小寫的格式存儲數據,則比較字符串「AAAA」和「aaaa」時,它們將相等。您可以在where子句中爲您的電子郵件列放置Latin1_General_CI_AS。

檢查下面的鏈接瞭解如何在SQL查詢實現排序規則。

How to do a case sensitive search in WHERE clause

0

退房this blog post,其中討論了在SQL不區分大小寫的搜索。實質上,它如此緩慢的原因是很可能當前的表索引都不能用於查詢中,所以數據庫引擎必須多次執行全表掃描。

想要的大寫的版本(UPPER(arcus.email2))之間進行比較,因爲數據庫引擎無法查找值的指數當arcus.email2索引是完全無用的(因爲它們是不同的值!)。

爲了提高性能,您可以在應用UPPER到外地的結果明確創建索引。

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