Как выполнить поиск и замену с учетом регистра в SQL 2000/2005?
-
02-07-2019 - |
Вопрос
Чтобы выполнить поиск/замену с учетом регистра в таблице базы данных 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'