SQL Server的WHERE子句中的空格

时间:2018-10-01 13:20:04

标签: sql sql-server

我想找出某个列中仅包含一个空格而没有其他内容的记录。因此,我编写了以下查询中的第一个:

select COUNT(*)
from mytable
where col = ' ' -- One space

select COUNT(*)
from mytable
where col = '  ' -- Two spaces

select COUNT(*)
from mytable
where col = '  ' -- Three spaces

但是,所有三个查询都返回完全相同的记录。 Microsoft SQL Server是否不区分空格数量?如何精确查询一个,两个或多个空格?

4 个答案:

答案 0 :(得分:7)

是的,它会忽略比较中的尾随空格。

您可以尝试添加定界字符。

SELECT count(*)
FROM mytable
WHERE col + 'X' = ' X';

答案 1 :(得分:3)

Ivan Starostin在OP的评论中发布的link提供了很好的解释,我认为它值得一个完整的答案,而不仅仅是评论。

总而言之,请尝试使用LIKE代替相等:

select COUNT(*)
from mytable
where col LIKE ' ' -- one space

您还可以使用DATALENGTH来计算字段中有多少字节以再次检查字段长度:

select col, DATALENGTH(col)
from mytable;

请注意,如果col是VARCHAR vs NVARCHAR,则DATALENGTH将返回不同的值。由于NVARCHAR以Unicode存储,因此VARCHAR将每个字符存储为1个字节,而NVARCHAR将每个字符存储为2个字节。

答案 2 :(得分:2)

您可以将DATALENGTH子句与查询结合使用:

   select COUNT(*)
   from mytable
   where col = ' '
   and DATALENGTH(col) = 1

答案 3 :(得分:0)

您可以用单个字符替换单个空格(例如§),然后将此字符置于where状态:

declare @tmp table(col varchar(50))

insert into @tmp values
(' '),
('  '),
('   ')

select COUNT(*) as one_space_count
from @tmp
where replace(col,' ','§')='§'

select COUNT(*) as two_space_count
from @tmp
where replace(col,' ','§')='§§'

select COUNT(*) as three_space_count
from @tmp
where replace(col,' ','§')='§§§'

结果:

enter image description here