我想找出某个列中仅包含一个空格而没有其他内容的记录。因此,我编写了以下查询中的第一个:
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是否不区分空格数量?如何精确查询一个,两个或多个空格?
答案 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,' ','§')='§§§'
结果: