Конкатенация строк T-SQL `'string' + str (integer)` вводит лишний пробел - PullRequest
0 голосов
/ 24 мая 2018

Извините за несколько тривиальный вопрос, но почему

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'

not

'book case'

и, согласно документации Data Explorer , SQL-код, используемый в Stack Exchange Data Explorer, действительно является T-SQL.


Некоторые дополнительные эксперименты:

select str(42);

возвращает "42", без лишних пробелов (см. РЕДАКТИРОВАТЬ ниже) .

select ('foo' + 'bar');

возвращает "foobar", также безпробелы.

select ('foo' + '42');

возвращает "foo42", поэтому он не обрабатывает цифры специально или что-то в этом роде.


Мне кажется, что базовый семантический принцип композиционностинарушались.Что мне здесь не хватает?


EDIT Проблема оказалась неверным предположением, что

select str(42); 

возвращает "42".На самом деле он возвращает

"        42"

, но пробелы игнорируются браузерным графическим интерфейсом.

Вот еще один пример, который более четко демонстрирует проблему:

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

, кажется, возвращает

"foo 42"

, но на самом деле возвращает

"foo        42"

как можно увидеть в этом запросе:

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

, который возвращает 13 (не 5, а также не 6).Большое спасибо @ lad2025 за указание на это.

Итак, в основном это была «оптическая иллюзия», вызванная несколько неточным представлением строковых результатов в браузере.

1 Ответ

0 голосов
/ 24 мая 2018

Проблема: STR:

Возвращает символьные данные, преобразованные из числовых данных.

STR (выражение с плавающей запятой [, длина [, десятичное число]])

Общая длина.Это включает в себя десятичную точку, знак, цифры и пробелы. По умолчанию 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';

См. Демонстрацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...