sql server中的子串

时间:2015-08-12 14:09:57

标签: sql sql-server tsql

我正在尝试使用以下查询提取子字符串。我没有得到预期的结果。

DECLARE @st1 varchar(10)
SET @st1 = 'Case # 00548295'
SELECT @st1,ltrim(SUBSTRING(@st1, CHARINDEX('# ', @st1) + 1, LEN(@st1)))

我得到了005作为答案。我试图在' Case [space]#[Space] ..."之后提取整数值。我的结果需要是00548295.这里有什么问题

5 个答案:

答案 0 :(得分:3)

您将@st1定义为varchar(10),然后尝试为其分配15个字符('Case # 00548295')。在这种情况下,SQL Server会以静默方式截断数据。

只需增加尺寸:

DECLARE @st1 varchar(20)
SET @st1 = 'Case # 00548295'
SELECT @st1,ltrim(SUBSTRING(@st1, CHARINDEX('# ', @st1) + 1, LEN(@st1)))

答案 1 :(得分:2)

你没有给你的varchar变量足够的字符来保持整个字符串的开头。

DECLARE @st1 varchar(20)
SET @st1 = 'Case # 00548295'
SELECT @st1,ltrim(SUBSTRING(@st1, CHARINDEX('# ', @st1) + 1, LEN(@st1)))

-------------------- --------------------
Case # 00548295      00548295

(1 row(s) affected)

答案 2 :(得分:2)

正如其他人所说,你需要增加你的变量大小。至于你的查询,你可以简单地摆脱'Case#'

,而不是将这些数字排除在外
DECLARE @st1 varchar(20)
SET @st1 = 'Case # 00548295'
SELECT @st1, REPLACE(@st1, 'Case # ', '')

答案 3 :(得分:1)

您的字符串值为varchar(10),最多10个字符。如果您选择@st1,则会看到它被截断为10个字符:'案例#005'。您需要将此声明为至少varchar(15)

答案 4 :(得分:1)

除了已经识别的varchar(15)问题之外,您还可以避免使用“ltrim”并对分隔符进行参数化,如下所示:

DECLARE @st1 varchar(15)
declare @delimiter nvarchar(2) = '# ';
declare @delim_len int = DATALENGTH (@delimiter) / 2;
SET @st1 = 'Case # 00548295'
SELECT @st1, SUBSTRING(@st1, CHARINDEX(@delimiter, @st1) + @delim_len, LEN(@st1))

或者更进一步,将其变为SQL函数:

if object_id('UFN_STRINGAFTER') is not null
begin
  drop function UFN_STRINGAFTER;
end
go


create function dbo.UFN_STRINGAFTER
(
  @input nvarchar(max)
 ,@delimiter nvarchar(max) = '# '
)
returns nvarchar(max)
as
begin
  declare @delim_len int = DATALENGTH (@delimiter) / 2;
  return SUBSTRING(@input, CHARINDEX(@delimiter, @input) + @delim_len, LEN(@input));
end;
go

select dbo.UFN_STRINGAFTER('Case # 00548295',default);