T-SQL 字符串串联"字符串"+ str(整数)"引入了额外的空格字符



很抱歉这个问题有点微不足道,但为什么

select ('https://stackoverflow.com/users/' + str(Id)) as Link
from Users
where DisplayName = 'Jon Skeet';

在数据资源管理器返回中输入时

https://stackoverflow.com/users/ 22656

而不是

https://stackoverflow.com/users/22656

根据Microsoft关于T-SQL+运算符的文档,

'book' + 'case'

应该给

'bookcase'

'book case'

根据数据资源管理器文档,Stack Exchange 数据资源管理器中使用的 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指出这一点。

因此,这主要是一种"视错觉",由浏览器中字符串结果的表示有些不准确引起。

问题是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';

查看演示

最新更新