对于这个有点微不足道的问题感到抱歉,但为什么
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指出这一点。
因此,它主要是由于浏览器中字符串结果的不准确表示而导致的“视错觉”。
答案 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 强>