【问题标题】:Search for Accented Characters搜索重音字符
【发布时间】:2013-05-16 05:31:15
【问题描述】:

我环顾四周,发现了很多关于创建不区分口音的搜索的信息。这不是我想要的。

一些重音数据导致我的 UI 出现问题,我希望进行一些影响分析。

有没有一种优雅的方法来搜索字段中的任何重音字符,而不是联合许多不同的选择,每个选择具有不同的字符?

【问题讨论】:

    标签: sql-server diacritics


    【解决方案1】:

    COLLATE 子句更改 foo 表达式以允许您单独进行 GROUP BY

    DECLARE @t TABLE (foo varchar(100));
    
    INSERT @t VALUES ('bar'), ('bár'), ('xxx'), ('yyy'), ('foo'), ('foó'), ('foö');
    
    SELECT
        foo COLLATE Latin1_General_CI_AI, 
        MIN(foo COLLATE Latin1_General_CI_AS), MAX(foo COLLATE Latin1_General_CI_AS)
    FROM
        @t
    GROUP BY
        foo COLLATE Latin1_General_CI_AI
    HAVING
        MIN(foo COLLATE Latin1_General_CI_AS) <> MAX(foo COLLATE Latin1_General_CI_AS);
    

    或者

    SELECT
        foo COLLATE Latin1_General_CI_AI,
        COUNT(*)
    FROM
        @t
    GROUP BY
        foo COLLATE Latin1_General_CI_AI
    HAVING
        COUNT(*) > 1;
    

    第一个给你一些实际值,而不仅仅是一个 COUNT。但如果您有多个重音词,则不是全部

    对于 SQL Server 2012,你可以使用这个

    SELECT
        *
    FROM  
        ( 
        SELECT
            FIRST_VALUE(foo) OVER (PARTITION BY foo COLLATE Latin1_General_CI_AI ORDER BY foo COLLATE Latin1_General_CI_AS) AS safeFoo,
            foo
        FROM
            @t
        ) X
    WHERE
        safeFoo <> foo
    

    第一个和第三个依赖于非重音字符在重音字符之前的排序

    【讨论】:

    • 我不是要计算个人数量。我只需要特定列具有重音字符的总行数。
    • 然后修改第二个。 COLLATE 的使用仍然适用。
    猜你喜欢
    • 2017-06-15
    • 2012-04-18
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多