【问题标题】:SELECT/COUNT column with case insensitive values具有不区分大小写值的 SELECT/COUNT 列
【发布时间】:2018-04-25 03:37:37
【问题描述】:

我有一个 DB 列,其中包含在未检查大小写时可能相互匹配的值:

my_column
---------
foo
bar
BAR
baz

列定义如下所示:

[my_column]   NVARCHAR (15)   COLLATE SQL_Latin1_General_CP1_CS_AS NULL

当我这样选择时:

SELECT my_column FROM my_table ORDER BY my_column;

...我可以看到所有结果,但我只想查看将LOWER() 应用于所有值时重复的值,以及有多少重复值。所以我理想的结果是这样的:

my_column | count
----------+-------
 bar      |  2

我假设这里需要GROUP BYHAVING,但我不确定你如何告诉SQL“找到所有匹配自己的东西,当变成小写时”。 p>

【问题讨论】:

  • 您需要单独计算 bar 和 BAR 吗?
  • no @AayQue - 如果 BAR 和 bar 出现,它们被认为是重复的,我想显示 2 来表示这两个事件。
  • 可能值得探索一下可供您使用的不同排序规则设置docs.microsoft.com/en-us/previous-versions/sql/… 此外,SQL 服务器默认不区分大小写 - 您是否有必要为整个数据库启用区分大小写?跨度>
  • 使用函数将导致您在该列上的任何索引被忽略。你能改变那张桌子上的排序规则吗?还是您需要使用区分大小写的排序规则?

标签: sql sql-server


【解决方案1】:

这是你想要的吗?

DECLARE @tbl TABLE 
  ( 
     my_column VARCHAR(25) 
  ) 

INSERT INTO @tbl 
VALUES      ('foo'), 
            ('bar'), 
            ('BAR'), 
            ('baz') 

SELECT Lower(my_column) AS my_column, 
       Count(*)         AS count 
FROM   @tbl 
GROUP  BY Lower(my_column) 
HAVING Count(*) > 1 

返回:

my_column   count
bar         2

【讨论】:

  • 啊,count(*) 是缺少的链接。谢谢!
【解决方案2】:

这应该可以完成工作:

SELECT Lower(my_column), 
       Count(*) 
FROM   my_table 
GROUP  BY Lower(my_column) 
HAVING Count(*) > 1 

【讨论】:

    【解决方案3】:

    试试这个:

    SELECT 
        my_column,
        count(*) 
    FROM 
    (
        SELECT 
            lower(my_column) as my_column 
        FROM 
            my_table
    ) as t
    ORDER BY 
        my_column
    HAVING 
        COUNT(*) > 1;
    

    【讨论】:

      【解决方案4】:

      这对我来说非常好

      declare @my_table table(
      my_column NVARCHAR (15)   COLLATE SQL_Latin1_General_CP1_CS_AS NULL
      )
      
      insert into @my_table(my_column)
      select 'foo'
      union all
      select 'BAR'
      Union all Select 'bar'
      Union all select 'BAZ'
      Union all select 'foo'
      
      
      select lower(my_column) as my_column, count(*) as count from @my_table
          group by lower(my_column)
          having count(*) >1
      

      【讨论】:

        【解决方案5】:
        SELECT Lower(my_column) AS my_column, 
               Count(*) 
        FROM   my_table 
        GROUP  BY Lower(my_column) 
        HAVING Count(Lower(my_column)) > 1; 
        

        【讨论】:

        • 这是一个区分大小写的排序规则,因此不会返回“BAR”和“bar”的匹配项。
        • 我不知道如何在此处附上我的屏幕截图。上面的查询应该适用于所有情况,我已经在我的本地测试过。
        • mysql> 从员工中选择 *; +-------------+----------------+-----------------+ |员工编号 |员工姓名 |员工工资 | +-------------+----------------+-----------------+ | 1 |维拉特·霍利 | 100 | | 2 |苏雷什雷纳 | 200 | | 3 |维拉特霍利 | 200 | | 4 |维拉特霍利 | 200 | +-------------+----------------+-----------------+ 4集合中的行(0.00 秒)
        • mysql> selectemployee_name, count(employee_name) fromemployee group by employee_name with count(employee_name) > 1; +---------------+----------+ |员工姓名 |计数(员工姓名) | +---------------+----------+ |维拉特·霍利 | 3 | +---------------+---------------------+ 1 行在集合中(0.00 秒)\
        • @Shawn 你测试过这个查询吗?它适用于所有情况。我已经分享了结果,请查看。
        猜你喜欢
        • 1970-01-01
        • 2013-09-22
        • 2023-03-12
        • 1970-01-01
        • 2014-09-25
        • 2013-04-25
        • 1970-01-01
        • 2015-06-29
        • 1970-01-01
        相关资源
        最近更新 更多