如何在SQL Server表中查找重复项,该表在列中具有尾随空格值

时间:2017-08-01 11:26:06

标签: sql sql-server

select COL1, count(COL1)
from Table1
group by COL1
having count (COL1) > 1;

我已经尝试了上面的查询,并根据没有尾随空格的数据得到了一些结果,但是上面的查询不适用于有尾随空格的数据,所以我尝试了下面的查询并没有得到任何结果。请建议

select COL1, count(COL1)
from Table1
where COL1 in(select Ltrim(Rtrim(COL1))from Table1)
group by COL1
having count (COL1) > 1;

3 个答案:

答案 0 :(得分:3)

如果你想计算COL1忽略前导和尾随空格的文本内容,那么就这样做吧。聚合时使用ltrim(rtrim(COL1))

select
    ltrim(rtrim(COL1)) AS COL1_trimmed
    count(*) cnt
from Table1
group by ltrim(rtrim(COL1))
having count(*) > 1;

答案 1 :(得分:1)

通常,SQL Server会使用varchar()忽略尾随空格。但是,使用char()时不会。我在猜测尾随"空格"不是真正的空间。

这是example

with t as (
      select cast('a' as varchar(255)) as x union all
      select cast('a  ' as varchar(255))
    )
select t.x, count(*), min(t.x + '|') , max(t.x + '|')
from t
group by t.x;

返回:

a   2   "a  |"  "a|"

(我添加了双引号来澄清结果。)注意返回一行,而不是两行。但这些空间确实在价值的最后。

这使我怀疑尾随字符不是空格。

使用ASCII()函数调查它们的一种方法。

答案 2 :(得分:0)

另一种方法是首先从表格中的该列中删除尾随和前导空格。

如果COL1是VARCHAR类型:

update Table1
set COL1 = rtrim(ltrim(COL1))
where COL1 != rtrim(ltrim(COL1));

如果COL1是CHAR类型,那么您只需要左边修剪:

update Table1
set COL1 = ltrim(COL1)
where COL1 != ltrim(COL1);

在清理之后,您可以在不修剪列的情况下使用分组查询

select COL1, count(*) as Total
from Table1
group by COL1
having count(*) > 1;