Строковые функции T-SQL: разница между использованием Left / Right и Substring и странным поведением - PullRequest
1 голос
/ 01 апреля 2010

Я использую SQL Server 2008 и 2005 (Express). Я пытаюсь извлечь часть буквенно-цифровой строки из поля varchar.

RIGHT(str_field, 3) дает нулевые значения, но SUBSTRING(str_field, LEN(str_field)-2, LEN(str_field)) дает правильное значение. LEFT(str_field, 7) дает ожидаемые значения. Что дает?

Я бы подумал, что RIGHT(str_field, 3) и SUBSTRING(str_field, LEN(str_field)-2, LEN(str_field)) - эквивалентные выражения.

1 Ответ

2 голосов
/ 01 апреля 2010

У вас есть пробелы

RIGHT приведет к пробелам, но LEN игнорирует завершающие пробелы

DECLARE @foo varchar(100)
SET @foo = 'abc12345def   ' --3 spaces

--right or substring
SELECT RIGHT(@foo, 3)
SELECT SUBSTRING(@foo, LEN(@foo)-2, LEN(@foo))

--demonstrate you get spaces
SELECT REPLACE(RIGHT(@foo, 3), ' ', 'z') --single space

--length differences
SELECT LEN(@foo), DATALENGTH(@foo)

--solution
SELECT RIGHT(RTRIM(@foo), 3)
--or trim your column values before storing

См. SET ANSI_PADDING

Примечание: вы не получите получите NULL для ненулевого ввода ...

--only NULL if you send in NULL
SELECT RIGHT(NULL, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...