T-SQL字符串连接`'字符串'+ str(整数)`引入了额外的空格字符

时间:2018-05-24 13:24:18

标签: sql sql-server tsql

对于这个有点微不足道的问题感到抱歉,但为什么

select ('https://stackoverflow.com/users/' + str(Id)) as Link
from Users
where DisplayName = 'Jon Skeet';
输入Data Explorer返回时

https://stackoverflow.com/users/ 22656

而不是

https://stackoverflow.com/users/22656

根据微软的documentation on T-SQL's + operator

'book' + 'case'

应该给出

'bookcase'

'book case'

并且根据the Data Explorer documentation,Stack Exchange Data Explorer中使用的SQL风格确实是T-SQL。

一些额外的实验:

select str(42);

返回"42",没有额外的空格(请参阅下面的编辑)

select ('foo' + 'bar');

返回"foobar",也没有空格。

select ('foo' + '42');

返回"foo42",因此它不会特别处理数字或类似的数字。

对我来说,看起来好像违反了基本的语义成分原则。我在这里缺少什么?

编辑问题证明是错误的假设

select str(42); 

返回"42"。它实际上返回

"        42"

但基于浏览器的GUI会忽略这些空格。

这是另一个更清楚地说明问题的例子:

select 'foo' + str('42'); 

好像回来了

"foo 42"

但它实际上会返回

"foo        42"

可以在此查询中看到:

select LEN('foo' + str('42')); 

返回13(不是5,也不是6)。非常感谢@ lad2025指出这一点。

因此,它主要是由于浏览器中字符串结果的不准确表示而导致的“视错觉”。

1 个答案:

答案 0 :(得分:8)

问题是STR

  

返回从数字数据转换的字符数据。

     

STR(float_expression [,长度 [,十进制]])

     

总长度。这包括小数点,符号,数字和空格。 默认值为10.

select REPLACE(str(Id), ' ', '-')
from Users
where DisplayName = 'Jon Skeet';

OUTPUT:
-----22656

我只想使用CONCAT

select CONCAT('https://stackoverflow.com/users/', id) AS link
from Users
where DisplayName = 'Jon Skeet';

<强> See Demo