Как выполнить поиск с учетом регистра и заменить в SQL 2000/2005?

для выполнения поиска/замены с учетом регистра в таблице базы данных SQL Server 2000/2005 необходимо использовать правильные параметры сортировки.

Как определить, учитывается ли регистр параметров сортировки по умолчанию для базы данных, а если нет,то как выполнить поиск/замену с учетом регистра?

7 ответов


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'.


если у вас разные случаи того же слова в том же поле, а с заменить конкретных дел, тогда вы можете использовать сортировку в своем :

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 указывает с учетом регистра.


кроме того, это может быть полезно. выберите * из fn_helpcollations () - это получает все параметры сортировки, поддерживаемые сервером. выбрать * из sys.базы данных - здесь есть столбец, который указывает, какие параметры сортировки есть у каждой базы данных на сервере.


вы можете указать параметры сортировки при каждом запросе таблицы или применить параметры сортировки к столбцам постоянно, изменив таблицу.

Если вы решите сделать метод запроса, полезно также включить аргументы поиска без учета регистра. Вы увидите, что SQL выберет более эффективный план exec, если вы их включите. Например:

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