2009-02-04 74 views
3

具體來說,Sql Server 2005/T-Sql。我有一個字段,主要是一系列兩個字符,它們都應該是大寫字母,但是有一些遺留數據早於當前的數據庫/系統,我需要確定哪些記錄違反了上層套管公約。區分字符中的「AB」和「Ab」數據庫字段

我想這會工作:

select * from tbl where ascii(field1) <> ascii(upper(field1)) 

事實上它返回我的記錄屈指可數。現在他們已經得到糾正,現在該查詢沒有返回任何數據。但是我有人告訴我數據庫中仍然有混合數據,我剛剛找到一個例子:'FS'和'F'都報告相同的ASCII值。

爲什麼這種方法有缺陷?有什麼更好的方法可以解決這個問題,或者我該如何解決這種方法才能正確工作?

回答

5

如果所有的日期應該是在大寫只是做一個更新

update tbl 
set field1 = upper(field1) 

但回答你原來的問題這個查詢應該給你,你所期望的結果:

select * from tbl 
where field1 COLLATE Latin1_General_CS_AS <> upper(field1) 

編輯:剛纔注意到使用COLLATE的建議也發佈了Ian

2

如果您將一個表達式中的第一個字符傳遞給多字符字符串,ascii()函數將只返回ascii數字。要進行比較,您需要查看單個字符,而不是整個字段。

+0

打我吧:) – 2009-02-04 13:40:36

+0

嘎,我誤讀了Ascii的幫助。謝謝。 – peacedog 2009-02-04 13:42:23

+0

np,但我認爲@tehvan有一個好點,你可以完全省略ASCII的用法。 – cmsjr 2009-02-04 13:43:58

1

ASCII()函數只返回字符表達式最左邊字符的ASCII碼值。使用UPPER()代替。

3

ASCII只是比較第一個字母。您必須比較每個字母,或將數據庫歸類更改爲區分大小寫。

您可以在整個數據庫級別更改排序規則,或者只是在特定的查詢一名欄,所以:

SELECT myColumn 
    FROM myTable 
    WHERE myColumn COLLATE Latin1_General_CS_AS <> upper(myColumn) 
1

這可能會實現:

select * from tbl 
where cast(field1 as varbinary(256)) <> cast(upper(field1) as varbinary(256)) 
0

根據documentation for ASCII(),它只返回最左邊的字符。

我認爲你正在討論這個錯誤。 你根本就:

select * from tbl where field1 <> upper(field1) 

如果排序規則進行正確設置,so why not fix the collation rules?如果你不能永久改變它們,請嘗試:

select * from tbl where 
      (field1 collate Latin1_General_CS_AS) 
    <> upper(field1 collate Latin1_General_CS_AS) 
相關問題