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 に答える