SQL 2000/2005 で大文字と小文字を区別した検索と置換を実行するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/113901

質問

SQL Server 2000/2005 データベース内のテーブルに対して大文字と小文字を区別した検索/置換を実行するには、正しい照合順序を使用する必要があります。

データベースのデフォルトの照合順序で大文字と小文字が区別されるかどうかを確認するにはどうすればよいですか。また、区別されない場合は、大文字と小文字を区別した検索/置換を実行する方法はどうすればよいでしょうか?

役に立ちましたか?

解決

SELECT testColumn FROM testTable  
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'example' 

SELECT testColumn FROM testTable
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'EXAMPLE' 

SELECT testColumn FROM testTable 
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe' 

デフォルトの照合順序で大文字と小文字が区別されるとは想定せず、毎回大文字と小文字を区別する照合順序を指定してください (もちろん、言語に適した照合順序を使用してください)。

他のヒント

次のように、デフォルトの照合順序で大文字と小文字が区別されるかどうかを確認します。

select charindex('RESULT', 'If the result is 0 you are in a case-sensitive collation mode')

結果が 0 の場合は、大文字と小文字を区別する照合モードであることを示し、8 は大文字と小文字を区別しないことを示します。

照合順序で大文字と小文字が区別されない場合は、検索/置換を実行するときに使用する照合モードを明示的に宣言する必要があります。

使用する照合モードを指定して、大文字と小文字を区別した検索/置換を実行する UPDATE ステートメントを作成する方法は次のとおりです。

update ContentTable
set ContentValue = replace(ContentValue COLLATE Latin1_General_BIN, 'THECONTENT', 'TheContent')
from StringResource
where charindex('THECONTENT', ContentValue COLLATE Latin1_General_BIN) > 0

これは一致して置き換えられます 'THECONTENT', 、 だがしかし 'TheContent' または 'thecontent'.

あなたが持っている場合 さまざまなケース 同じ言葉の 同じ分野で, 、そしてしたいだけです 特定のケースを置き換える, 、その後、照合順序を使用できます REPLACE 関数:

UPDATE tableName
SET fieldName = 
    REPLACE(
        REPLACE(
            fieldName COLLATE Latin1_General_CS_AS,
            'camelCase' COLLATE Latin1_General_CS_AS,
            'changedWord'
        ),
        'CamelCase' COLLATE Latin1_General_CS_AS,
        'ChangedWord'
    )

これにより、次のような結果が得られます。

This is camelCase 1 and this is CamelCase 2

なる:

This is changedWord 1 and this is ChangedWord 2

複数のステートメントで実行できます。これ しない 置換する予定の大文字と小文字の両方を含む長い文字列がある場合に機能します。アクセントと大文字小文字が区別される、別の照合順序を使用する必要がある場合もあります。

UPDATE T SET [String] = ReplacedString
FROM [dbo].[TranslationText] T, 
    (SELECT [LanguageCode]
      ,[StringNo]
      ,REPLACE([String], 'Favourite','Favorite') ReplacedString
    FROM [dbo].[TranslationText]
    WHERE 
    [String] COLLATE Latin1_General_CS_AS like '%Favourite%'
    AND [LanguageCode] = 'en-us') US_STRINGS
WHERE 
T.[LanguageCode] = US_STRINGS.[LanguageCode] 
AND T.[StringNo] = US_STRINGS.[StringNo]

UPDATE T SET [String] = ReplacedString
FROM [dbo].[TranslationText] T, 
    (SELECT [LanguageCode]
      ,[StringNo]
      , REPLACE([String], 'favourite','favorite') ReplacedString 
    FROM [dbo].[TranslationText]
    WHERE 
    [String] COLLATE Latin1_General_CS_AS like '%favourite%'
    AND [LanguageCode] = 'en-us') US_STRINGS
WHERE 
T.[LanguageCode] = US_STRINGS.[LanguageCode] 
AND T.[StringNo] = US_STRINGS.[StringNo]

まず最初にこれを確認してください。http://technet.microsoft.com/en-us/library/ms180175(SQL.90).aspx

CI は大文字と小文字を区別しないことを指定し、CS は大文字と小文字を区別することを指定していることがわかります。

また、これは役に立つかもしれません。select * from fn_helpcollat​​ions() - これにより、サーバーがサポートするすべての照合順序が取得されます。select * from sys.databases - ここには、サーバー上のすべてのデータベースの照合順序を指定する列があります。

テーブルをクエリするたびに照合順序を指定することも、テーブルを変更して照合順序を列に永続的に適用することもできます。

クエリ メソッドを実行することを選択した場合は、大文字と小文字を区別しない検索引数も含めると有益です。これらを含めると、SQL がより効率的な実行計画を選択することがわかります。例えば:

SELECT testColumn FROM testTable 
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe' 
    and testColumn = 'eXaMpLe'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top