很抱歉这个问题有点微不足道,但为什么
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';
查看演示