2012-11-03 62 views
2

這可能是非常基本的,但我想不出如何編寫SQL查詢來查找具有相同字符但大小寫不同的字符串。Rails/SQL:查找具有相同值但大小寫不同的屬性

我正在處理的上下文是Rails 3.2應用程序。我有一個帶有Name屬性的簡單Tag模型。我繼承了這個模型的數據,這些數據不以大小寫不敏感的方式存儲值,所以有些用戶輸入諸如「Tree」之類的東西,而其他用戶輸入「tree」,現在我們有兩個真正應該是一個的標籤。

所以,我想要做一個查詢來找到所有這些對,以便我可以合併它們。

我能想到的,到目前爲止的唯一的事情就是寫,通過所有這些,檢查環的匹配值rake任務......是這樣的:

pairs = [] 
Tag.all.each do |t| 
    other = Tag.where('name LIKE ?', t.name) 
    pairs << [t, other] if other 
end 

不過,我不知道上面會起作用,或者說它在性能方面是有意義的。有沒有更好的方法來編寫可以查找這些匹配對的SQL查詢?

回答

2

有個類似這樣的問題here

你可以做的就是在你的模型中創建一個方法來做一個不區分大小寫的搜索。從我的經驗卻是ActiveRecord的已經不區分大小寫的搜索,但以防萬一:

def self.insensitive_find_by_tag_name(name) 
    Tag.where("lower(name) = ? ", name.downcase) 
end 

,然後刪除重複的條目,你可以做這樣的事情

Tag.transaction! do 
    tags = Tag.insensitive_find_by_tag_name(name) 

    tags.last(tags.length() - 1).each do |tag| 
     tag.destroy   
    end 
end 

電話交易只如果有任何失敗,數據庫將回滾。抓住所有具有相同名稱的標籤,然後刪除任何額外的條目。如果你想剩下的標籤條目是小寫,那麼你可以做

tag = tags.first 
tag.name = tag.name.downcase 
tag.save! 
+0

我最終做了一件與此非常相似的事情,並且它運行良好。謝謝! – Andrew

0

我並不擅長SQL,但我研究了一下,發現使用COLLATE子句可以使SQL中的字符串操作區分大小寫。 (通常選擇不同的操作不區分大小寫)。

所以也許你可以試試:

select distinct (name) COLLATE sql_latin1_general_cp1_cs_as 
    FROM (
    ... blah blah blah 

下面是整理一些文檔: http://dev.mysql.com/doc/refman/5.0/en/charset-collate.html

(假設你使用MySQL我猜)

或者,您也可以通過collat​​e將數據庫重新配置爲區分大小寫。然後你當前的查詢可能會奏效不變

(假設你有管理權限,並且重新配置能力)

+0

FWIW我正在使用PostgreSQL。我會看看Collat​​e,看看我能不能理解它:) – Andrew

相關問題