【问题标题】:Look for trailing spaces in a table在表格中查找尾随空格
【发布时间】:2011-12-21 18:06:03
【问题描述】:

我想知道如何识别表格中的尾随空格。我正在使用 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,并且“修剪尾随空白”的值设置为 no。

那么为什么我的数是 3?我只期待 1 个。

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

select * from first_test_name
where firstName like '% '

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

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

【问题讨论】:

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


【解决方案1】:

为什么我在搜索“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 '

【讨论】:

  • 感谢您的回答和链接(这实际上很有帮助)。
  • 您在这部分查询中检查什么? '鲍勃 %[^ ]%'
  • @Ray - 第一位匹配值以Bob{space} 开头,并且可以使用索引来查找匹配记录。第二位消除任何以Bob{space} 开头但具有以下非空格字符(例如Bob Hope)的匹配项。仔细想想,这些都不是必需的。 LIKE 'Bob ' 工作正常。
  • 我感觉这就是它要寻找的东西,但感谢您确认这一点。是的,就像“BOB”一样,我真正需要的是我正在寻找的数据。再次感谢@Martin。
【解决方案2】:

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

这就是我要做的:

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

【讨论】:

  • 我更喜欢这个答案。对我来说,我在 where 子句中做了类似的事情:where replace(relationship, 'S', 'S_') = 'S_'。当我在选择中执行相同操作时,选择语句是在尝试查找尾随空格时发现的:选择关系,替换(关系,'S','S_')来自X
【解决方案3】:

选择 * 来自用户 WHERE DATALENGTH(用户名) DATALENGTH(RTrim(用户名))

【讨论】:

    【解决方案4】:

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

    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。

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

      • 这行不通,因为尾随空格在 =&lt;&gt; 字符串比较中没有区别。
      • SQL-Server 中是否有 != 选项,还是只有 Oracle,如果有,会更好吗?
      • 它是可用的,但它的行为没有任何不同。它仍然遵守此处列出的比较谓词规则support.microsoft.com/kb/316626
      【解决方案6】:

      我最近在寻找,但找不到这个问题的答案。自从遇到一个后,我想我会分享。

      https://stackoverflow.com/a/14188944/1953837

      默认情况下,LEN 会修剪尾随空格。使用下面将它们移到前面,然后计算字段长度。

      希望这对以后搜索的人有所帮助。

      (LEN(REVERSE(字段名))

      【讨论】:

        猜你喜欢
        • 2011-02-02
        • 2012-06-27
        • 2014-04-25
        • 2016-10-21
        • 1970-01-01
        • 2015-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多