我有以下字符串:
DECLARE @build_names VARCHAR(5000) = NULL;
SET @build_names = 'BB10-1_X-4759-566549';
我想从最后一个中提取它,-
是分隔符。该字符串将被提取为3个子字符串,即566549
,4759
,BB10-1_X
。
请帮助我,我是初学者。
答案 0 :(得分:2)
您可以使用charindex()
和reverse()
来获得所需的结果:
declare @temp varchar(40)
set @temp = 'BB10-1_X-4759-566549'
select @temp, REVERSE(@temp)
select REVERSE(substring(REVERSE(@temp),0,CHARINDEX('-',REVERSE(@temp),0)))
给它一个机会。它回答了你在字符串的最后一个-
之后提取的第一个问题。
您问题的下一部分似乎表明您希望根据-
分割整个内容。使用存储过程或函数将失败,因为您希望BB10-1_X是单个字符串。因此,如果这些字符串始终采用这种格式,只有三个-
,但您只需要3个子字符串,则可以像这样硬编码。
declare @temp varchar(40), @reverse varchar(40), @sub1 varchar(20), @sub2 varchar(20), @sub3 varchar(20)
SET @temp = 'BB10-1_X-4759-566549'
SET @reverse = REVERSE(@temp)
SET @sub3 = REVERSE(substring(@reverse,0,CHARINDEX('-',@reverse,0)))
SELECT @temp = substring(@temp,0,charindex(REVERSE(substring(@reverse,0,CHARINDEX('-',@reverse,0))),@temp,0)-1)
SELECT @reverse = REVERSE(@temp)
SET @sub2 = REVERSE(SUBSTRING(@reverse,0,CHARINDEX('-', @reverse, 0)))
SET @sub1 = REVERSE(SUBSTRING(@reverse,CHARINDEX('-',@reverse,0)+1,LEN(@temp)-CHARINDEX('-',@reverse,0)))
select @sub1, @sub2, @sub3
答案 1 :(得分:2)
有很多关于TSQL的高效拆分功能的文章。我怀疑潜入这个问题对于这个问题可能有点过分,因为它非常具体。
这里介绍了一些基本的TSQL字符串操作。
注意:为了清楚起见,我使用公用表表达式(CTE),但这些操作可以在线完成。
DECLARE @build_names VARCHAR(5000) = NULL
SET @build_names = 'BB10-1_X-4759-566549'
;WITH cte AS (
SELECT CHARINDEX('-',REVERSE(@build_names),1) RevPosLastSep
,CHARINDEX('-',@build_names,CHARINDEX('-',@build_names,1)+1) PosFirstSep
)
SELECT RIGHT(@build_names,RevPosLastSep-1)
,SUBSTRING(@build_names,PosFirstSep+1,LEN(@build_names) - RevPosLastSep - PosFirstSep)
,LEFT(@build_names,PosFirstSep-1)
FROM cte
答案 2 :(得分:1)
您可能想要创建拆分功能
CREATE FUNCTION [dbo].[fnSplitString]
(
@string NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @output TABLE(splitdata NVARCHAR(MAX)
)
BEGIN
DECLARE @start INT, @end INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
WHILE @start < LEN(@string) + 1 BEGIN
IF @end = 0
SET @end = LEN(@string) + 1
INSERT INTO @output (splitdata)
VALUES(SUBSTRING(@string, @start, @end - @start))
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
END
RETURN
END
执行此T-sql语句以创建函数并用作
select 4,3,1+'-'+2 from dbo.fnSplitString('BB10-1_X-4759-566549','-')