2

我们在加载到我们的数据仓库中的仪器名称时遇到问题,其中它们要么以全部大写或正常大小写(每个单词开头的大写字母)加载字符串。我们有一个处理将所有大写字符串更改为正常大小写的函数,其中一些示例如下:

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

但我不知道如何将大写表合并到其中,以便它可以检查整个字符串中所有可能的大写字母。有什么帮助吗?

4

2 回答 2

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

哪个会返回:

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

注意:我从@SQL Kiwi在这里找到了基本代码,并将其更改为使用函数,如果这是您必须在一致的基础上做的事情

于 2012-12-17T17:21:34.250 回答
1

我想我读错了所有可能的大写字母。
最初,我将其视为一个单词的所有可能性。
当您的意思是所有大写行时。

在我的 SQL 2008R2 上,from 不区分大小写

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

我认为你的问题将是相反的。如何不找到所有组合。

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

我的经验是 TSQL 中的选择/查找端始终不区分大小写。
我认为您将需要 CLR 来获得所需的区分大小写的级别。
如果速度是一个问题,我会使用 .NET 并将 Capital 读入和 Dictionary 并使用 Regex 进行处理。

于 2012-12-17T17:42:36.980 回答