2012-12-17 35 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,我在上面的评论中包含了你。你提出一个非常有用的观点。 –