我正在尝试使用以下查询提取子字符串。我没有得到预期的结果。
DECLARE @st1 varchar(10)
SET @st1 = 'Case # 00548295'
SELECT @st1,ltrim(SUBSTRING(@st1, CHARINDEX('# ', @st1) + 1, LEN(@st1)))
我得到了005作为答案。我试图在' Case [space]#[Space] ..."之后提取整数值。我的结果需要是00548295.这里有什么问题
答案 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);