Как выполнить поиск и замену с учетом регистра в SQL 2000/2005? - PullRequest
8 голосов
/ 22 сентября 2008

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

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

Ответы [ 7 ]

13 голосов
/ 22 сентября 2008
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' 

Не думайте, что сортировка по умолчанию будет чувствительной к регистру, просто указывайте регистр с учетом каждый раз (используя правильный для вашего языка, конечно)

8 голосов
/ 22 сентября 2008

Определите, учитывается ли регистр по умолчанию с учетом регистра, например:

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

2 голосов
/ 24 февраля 2017

Если у вас есть различные случаи одного и того же слова в одном и том же поле , и вы хотите заменить только конкретные случаи , то вы можете использовать сопоставление в своем 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
1 голос
/ 11 сентября 2013

Может быть сделано в нескольких утверждениях. Это не будет работать , если у вас есть длинные строки, которые содержат заглавные и строчные слова, которые вы собираетесь заменить. Вам также может понадобиться использовать другие параметры сортировки, это акцент и регистр символов.

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]
0 голосов
/ 24 октября 2008

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

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

SELECT testColumn FROM testTable 
    WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe' 
    and testColumn = 'eXaMpLe'
0 голосов
/ 22 сентября 2008

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

0 голосов
/ 22 сентября 2008

Прежде всего, проверьте это: http://technet.microsoft.com/en-us/library/ms180175(SQL.90).aspx

Вы увидите, что CI определяет регистр без учета регистра, а CS - регистр символов

...