在表中查找尾随空格

时间:2011-12-21 18:06:04

标签: sql sql-server sql-server-2008 tsql

我想知道如何识别表格中的尾随空格。我正在使用SQL Server 2008并将下表创建为测试

CREATE TABLE  first_test_name
   ( 
   firstName varchar(255)
    )

然后插入一条这样的记录:

insert into first_test_name (firstName)
values('Bob')

然后我尝试插入一个空格,然后添加一个像这样的新记录:

insert into first_test_name (firstName)
values('Bob ') -- just 1 space

第三次,

insert into first_test_name (firstName)
values('Bob  ')   -- two spaces used this time.

现在如果我查询'Bob'(没有空格),我仍然得到3的计数。 我的疑问是:

select count(*) from first_test_name WHERE firstName = 'Bob'

答案不应该是1?

此外,我在此表上使用了sp_help,并且“Trim Trailing Blanks”的值设置为no。

那为什么我得到3分?我只期待一次。

在相关说明中,如果我使用此查询进行搜索

select * from first_test_name
where firstName like '% '

然后我找到了两行的正确答案。

所以重申一下,问题是为什么我在搜索'Bob'时得到3分。 此外,在这种情况下,“修剪尾随空白”是什么意思?

5 个答案:

答案 0 :(得分:6)

  

为什么我在搜索'Bob'时得到3分?

SQL Server ignores trailing spaces in most string comparisons.

  

此外,在这种情况下,“修剪尾随空白”是什么意思?

这会告诉您创建表时设置的ANSI_PADDING选项。

  

如何识别带有1或2个尾随空格的那两个?

这是一种方式。

SELECT *
FROM first_test_name 
WHERE firstName LIKE 'Bob '

找到没有尾随空格的

SELECT *
FROM first_test_name 
WHERE firstName LIKE 'Bob' AND firstName NOT LIKE 'Bob '

答案 1 :(得分:3)

SQL Server将在比较期间使用空格扩展字符串。

这就是我要做的事情:

SELECT  COUNT(*)
FROM first_test_name
WHERE REPLACE(firstName, ' ', '_') = 'Bob'

答案 2 :(得分:2)

SELECT * 来自用户 WHERE DATALENGTH(用户名)<> DATALENGTH(RTRIM(用户名))

答案 3 :(得分:1)

另一种方法可能是在字符串上附加内容。

declare @test table(
id varchar(4) not null,
firstname varchar(255) not null)

insert into @test values('1', 'Bob')
insert into @test values('2', 'Bob ')
insert into @test values('3', 'Bob  ')
insert into @test values('4', ' Bob')

select count((firstname + 'end')) from @test 
where (firstname + 'end') not like '% %'

查询将返回计数1.

答案 4 :(得分:1)

一个很好的干净方法是将原始字符串与Rtrim版本本身进行比较,如果它们不匹配,例如:

SELECT *
FROM First_Test_Name
WHERE Firstname <> RTrim(Firstname)

这应该返回Firstname有尾随空格的所有记录(我认为......)