Sql server 2005 T-SQL字符串函数:使用左/右和子字符串与奇怪行为之间的区别

Sql server 2005 T-SQL字符串函数:使用左/右和子字符串与奇怪行为之间的区别,sql-server-2005,tsql,sql-server-2008,Sql Server 2005,Tsql,Sql Server 2008,我正在使用SQLServer2008和2005(Express)。我试图从varchar字段中提取字母数字字符串的一部分 RIGHT(str\u字段,3)生成空值,但子字符串(str\u字段,LEN(str\u字段)-2,LEN(str\u字段))给出正确的值左侧(str_字段,7)给出预期值。有什么好处 我本以为RIGHT(str_字段,3)和子字符串(str_字段,LEN(str_字段)-2,LEN(str_字段))是等价的表达式。有尾随空格 DECLARE @foo varchar(100

我正在使用SQLServer2008和2005(Express)。我试图从varchar字段中提取字母数字字符串的一部分

RIGHT(str\u字段,3)
生成空值,但
子字符串(str\u字段,LEN(str\u字段)-2,LEN(str\u字段))
给出正确的值<代码>左侧(str_字段,7)给出预期值。有什么好处


我本以为
RIGHT(str_字段,3)
子字符串(str_字段,LEN(str_字段)-2,LEN(str_字段))
是等价的表达式。

有尾随空格

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
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

注意:对于非NULL输入,您不会得到NULL

--only NULL if you send in NULL
SELECT RIGHT(NULL, 3)