2012-12-17 50 views
2

我們在加載到我們的數據倉庫中的工具名稱存在問題,它們或者以大寫或正常情況下加載字符串(首字母大寫每個字)。我們有一個不斷變化的所有大寫字符串轉換爲正常情況下和其中的一些例子中涉及的函數低於:用交叉參考臨時表替換部分字符串 - tsql

Merck & Co Inc Common Stock Usd.5 
Newmont Mining Corp Common Stock Usd Inc 1.6 

但是也有這個,我們想的部分,當談到大寫舉例來說,在上面的例子中,'Usd'應該變成'USD','Inc'變成'INC','Corp'變成'CORP'。

這些都是在交叉參考表中,但我不確定如何更新我的選擇,以便當我選擇我的正常情況下的儀器名稱時,它將檢查交叉參考表以確保更新(替換)部分應該大寫爲首都。

我得到儘可能的:

CREATE TABLE capital ([InternalValue] VARCHAR(255), [ExternalValue] VARCHAR(255)); 

CREATE TABLE instrument ([Instrument] VARCHAR(255)); 

INSERT INTO capital ([InternalValue], [ExternalValue]) 
VALUES 
('Usd', 'USD'), 
('Ltd', 'LTD'), 
('Corp', 'CORP'), 
('Inc', 'INC') 

INSERT INTO instrument ([Instrument]) 
VALUES 
('Merck & Co Inc Common Stock Usd.5'), 
('Newmont Mining Corp Common Stock Usd Inc 1.6'); 

SELECT REPLACE(Instrument, 'Usd', 'USD') FROM instrument AS i 

但我不知道我可以納入資本表到這一點,以便它可以檢查整個字符串的所有可能capitalisations。任何幫助?

回答

3

如果您有想要作爲表的替代使用你的價值觀能夠你要反覆執行此操作,那麼你可以創建一個函數來進行替換:然後

create function replacement(@string varchar(max)) 
returns varchar(max) 
as 
begin 

    with ReplaceWord(InternalWord, ExternalWord) as 
    (
     select InternalValue, ExternalValue 
     from capital 
    ) 
    select @string = REPLACE(@string, r.InternalWord, r.ExternalWord) 
    from ReplaceWord r 
    where CHARINDEX(r.InternalWord, @string) > 0 

    return @string 
end 

到查詢數據可以使用:

SELECT dbo.replacement(i.Instrument) NewValue 
FROM instrument AS i 

SQL Fiddle with Demo

將返回:

|          NEWVALUE | 
------------------------------------------------ 
|   Merck & Co INC Common Stock USD.5 | 
| Newmont Mining CORP Common Stock USD INC 1.6 | 

注:我發現基本代碼here從@SQL獼猴桃和改變其使用功能,如果這是你將有一個一致的基礎上做

+0

感謝您的迴應bluefeet我已經完美地工作。但正如@Blam暗示的那樣,我如何確保我正在取代我想要取代的東西。即在上面的例子中,我們希望所有「Co」都是「CO」,但也要確保「Common」不會變成「COmmon」?有什麼方法可以查看替換字符串的長度,並且它只替換那個長度的單詞? –

1

我想我讀了所有可能的大寫字母錯誤。
本來我把它看作是一個單詞的所有可能性。
當你指的是大寫的所有行。

在我的SQL 2008 R2的距離是不區分大小寫

SELECT REPLACE('abCdefghicDE','cde','CDE'); 
returns 
abCDEfghiCDE 

我認爲你的問題將是相反的。 如何找不到所有組合。

SELECT REPLACE('corpo tunnel','Corp','CORP'); 
CORPo tunnel 

我的經驗是在TSQL中select/find端總是不區分大小寫。
我認爲你需要CLR來獲得你所需要的大小寫敏感級別。
如果速度是一個問題,我會使用.NET,並閱讀資本進入和字典和與正則表達式處理。

+0

感謝您的回覆Blam,我在上面的評論中包含了你。你提出一個非常有用的觀點。 –