如何在 SQL 2000/2005 中执行区分大小写的搜索和替换?

Posted

技术标签:

【中文标题】如何在 SQL 2000/2005 中执行区分大小写的搜索和替换?【英文标题】:How do I perform a case-sensitive search and replace in SQL 2000/2005? 【发布时间】:2010-09-11 22:48:23 【问题描述】:

为了对 SQL Server 2000/2005 数据库中的表执行区分大小写的搜索/替换,您必须使用正确的排序规则。

您如何确定数据库的默认排序规则是否区分大小写,如果不是,如何执行区分大小写的搜索/替换?

【问题讨论】:

【参考方案1】:
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' 

不要假设默认排序规则会区分大小写,只需每次指定一个区分大小写的排序规则(当然使用适合您的语言的正确排序规则)

【讨论】:

【参考方案2】:

确定默认排序规则是否区分大小写,如下所示:

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'

【讨论】:

【参考方案3】:

首先检查这个: http://technet.microsoft.com/en-us/library/ms180175(SQL.90).aspx

您会看到 CI 指定不区分大小写,而 CS 指定区分大小写。

【讨论】:

【参考方案4】:

另外,这可能很有用。 select * from fn_helpcollat​​ions() - 这将获取您的服务器支持的所有排序规则。 select * from sys.databases - 这里有一列指定服务器上每个数据库的排序规则。

【讨论】:

【参考方案5】:

您可以在每次查询表时指定排序规则,也可以通过更改表将排序规则永久应用于列。

如果您确实选择使用查询方法,那么包含不区分大小写的搜索参数也是有益的。您将看到,如果您包含它们,SQL 将选择更有效的执行计划。例如:

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

【讨论】:

【参考方案6】:

可以在多个语句中完成。 如果您的长字符串包含要替换的大写字母和小写字母,则此不会起作用。 您可能还需要使用不同的排序规则,这是区分重音和大小写的。

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]

【讨论】:

【参考方案7】:

如果你有不同的情况同一个词在同一个领域,并且只想替换特定的情况,那么你可以使用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

【讨论】:

以上是关于如何在 SQL 2000/2005 中执行区分大小写的搜索和替换?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 2000/2005 上设置与 Oracle 数据库的链接服务器?

如何在 SQL Server 2000/2005/2008 中使用 FLOAT 转换小数位数

在 SQL Server 2000/2005 中更新表的工具

Redshift SQL 可以执行不区分大小写的正则表达式求值吗?

如何在 SQL Server 2008 中删除区分大小写的检查?

oracle的sql命令有没有区分大小写