Как выполнить поиск и замену с учетом регистра в 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_helpcollations() — это получает все параметры сортировки, которые поддерживает ваш сервер.выберите * 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