代码之家  ›  专栏  ›  技术社区  ›  Andrew Myhre

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

  •  8
  • Andrew Myhre  · 技术社区  · 16 年前

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

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

    7 回复  |  直到 9 年前
        1
  •  19
  •   blowdart    16 年前
    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
  •  9
  •   wuerg    8 年前

    select charindex('RESULT', 'If the result is 0 you are in a case-sensitive collation mode')

    结果0表示您处于区分大小写的排序规则模式,8表示不区分大小写。

    如果排序规则不区分大小写,则需要显式声明执行搜索/替换时要使用的排序规则模式。

    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
  •  7
  •   Sean    8 年前

    不同情况 同一个词 ,只想 ,则可以在中使用排序规则 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
    
        4
  •  1
  •   Matas Vaitkevicius    11 年前

    可以在多个语句中完成。 这 不会 您可能还需要使用不同的排序规则—这是区分重音和大小写的。

    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]
    
        5
  •  0
  •   user20323    16 年前
        6
  •  0
  •   user20323    16 年前

    而且,这可能是有用的。 选择*from fn_helpcollations()-这将获取服务器支持的所有排序规则。 从sys.databases中选择*-这里有一列指定服务器上每个数据库的排序规则。

        7
  •  0
  •   nathan_jr    16 年前

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

    如果您确实选择使用查询方法,那么最好也包含不区分大小写的搜索参数。您将看到,如果将它们包括在内,SQL将选择一个更高效的exec计划。例如:

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