【问题标题】:SQL - distinct case-insensitive collation query - retrieve lower case row instead of firstSQL - 不同的不区分大小写的排序规则查询 - 检索小写行而不是第一个
【发布时间】:2012-10-27 13:39:06
【问题描述】:

使用具有不区分大小写排序规则的独特查询(如 SQL_Latin1_General_CP1_CI_AS)将检索任何不区分大小写的行的第一次出现。

但如果两种情况都存在,我想检索小写。

如果数据中只有一个案例,我想检索那个案例。 (唯一出现的大写字母应保留在结果集中的大写字母中)

表格:

id | col1  
----------
1 | Ab  
2 | ab  
3 | cd  
4 | Cd  
5 | Ef 

查询:

SELECT DISTINCT [col1] COLLATE SQL_Latin1_General_CP1_CI_AS 
FROM dbo.table

将检索:Ab, cd, Ef

但我想找回:ab, cd, Ef

有没有可以给我想要的结果的排序规则?

优先考虑小写而不是第一种。

如果不是,我必须使用子选择。

  1. 使用区分大小写的排序规则选择所有不同的值(奇怪的是自动排序,几乎是我想要的用例!)
  2. 使用不区分大小写的排序规则从 1 中选择

【问题讨论】:

    标签: sql distinct collation


    【解决方案1】:

    可能是这样的

    select
        min(T.col1 collate SQL_Latin1_General_CP1_CS_AS)
    from dbo.Table as T
    group by T.col1 collate SQL_Latin1_General_CP1_CI_AS
    

    【讨论】:

    • 嘿,别担心。这个问题在起作用,从那时起我就没有这样做,而且我不能 100% 确定 min 函数是否存在任何缺点。必须在接下来的工作中重新检查它。那我就接受了。
    【解决方案2】:

    应该这样做:

    WITH cte As
    (
       SELECT
          ID,
          Col1,
          ROW_NUMBER() OVER
          (
             PARTITION BY
                Col1 COLLATE SQL_Latin1_General_CP1_CI_AS
             ORDER BY
                 Col1 COLLATE SQL_Latin1_General_CP1_CS_AS DESC,
                 ID
          ) As RowNumber
       FROM
          dbo.Table
    )
    SELECT
       ID,
       Col1
    FROM
       cte
    WHERE
       RowNumber = 1
    ;
    

    【讨论】:

    • 如果我删除 DESC 它适用于一列。不过,这样的任务看起来相当复杂。我对使用两次排序规则的子查询的想法不起作用,sql 禁止两次排序规则(可能使用视图)。但是当我想在多个列上区分时,将第二列添加到 PARTITION BYORDER BY 它不起作用。
    猜你喜欢
    • 1970-01-01
    • 2011-05-11
    • 2011-03-18
    • 2019-06-19
    • 2014-05-10
    • 2012-06-26
    • 2012-01-12
    • 2011-05-23
    • 2013-04-17
    相关资源
    最近更新 更多