我有一项任务是根据字符串中斜线'/'位置的出现从字符串中打印子字符串.Below我试图向您展示我想要的一个示例示例。
cells
从上面的字符串我想根据斜线发生的位置打印子字符串值。
例如:有时我被要求在第二次出现slah之后打印子字符串然后我要显示Declare @My_string = 'abc/def gh /ijk l/m/no p/qr
有时我被要求在第三次出现之后打印子字符串然后{ {1}}如果是第一个,则显示ijk l
,反之亦然。根据需要,没有特定的发生位置可能会有所不同。我怎样才能实现它。任何帮助都会非常感激
注意:我想在不使用函数的情况下实现.i知道可以通过使用split函数来完成。可以不使用它来实现
答案 0 :(得分:1)
通过XML获得第3个位置的简单方法
实施例
Declare @My_string varchar(max)= 'abc/def gh /ijk l/m/no p/qr'
Select Pos3 = convert(xml,'<x>'+replace(@My_String,'/','</x><x>')+'</x>').value('/x[3]','varchar(100)')
<强>返回强>
Pos3
ijk l
答案 1 :(得分:1)
不使用函数的一种方法是使用递归cte
这不是我建议拆分字符串的方式,但由于你坚持不使用函数,这是一个合理的选择。
如果你改变主意去分割字符串函数,你应该阅读Aaron Bertrand的Split strings the right way – or the next best way并选择一个易于修改的分割字符串函数来返回项目编号。
示例数据:
DECLARE @My_string varchar(100) = 'abc/def gh /ijk l/m/no p/qr',
@SlashIndex int = 3
CTE:
;WITH CTE AS
(
SELECT LEFT(@My_String, CHARINDEX('/', @My_String)-1) As Value,
0 As SlashIndex,
RIGHT(@My_String, LEN(@My_String) - CHARINDEX('/', @My_String)) As String
WHERE CHARINDEX('/', @My_String) > 0
OR LEN (@My_String) > 0
UNION ALL
SELECT LEFT(String, CASE WHEN CHARINDEX('/', String) > 0 THEN CHARINDEX('/', String) ELSE LEN(String) +1 END -1),
SlashIndex + 1,
RIGHT(String, LEN(String) - CASE WHEN CHARINDEX('/', String) > 0 THEN CHARINDEX('/', String) ELSE LEN(String) END)
FROM CTE
WHERE CHARINDEX('/', String) > 0
OR LEN(String) > 0
)
查询:
SELECT Value
FROM CTE
WHERE SlashIndex = @SlashIndex
结果:m
答案 2 :(得分:1)
创建下面的函数,首先输入2个输入 - 你的位置和第二个将是你的字符串并返回所需的输出 -
create function dbo.GetSubsting ( @StatPoint int , @Input_string varchar(1000) )
returns varchar(1000)
as
begin
Declare @len int , @idx int =1 , @section int = 1 , @output varchar(1000) = ''
DECLARE @tab table ( idx int identity(1,1 ), Val char(1) , section int )
select @len = len(@Input_string)
while @idx <= @len
begin
insert into @tab
select substring( @Input_string , @idx ,1) , @section
if substring( @Input_string , @idx ,1) = '/'
set @section = @section + 1
set @idx = @idx + 1
end
select @output = @output + Val from @tab where section = @StatPoint
select @output = replace(@output , '/' , '')
RETURN @output
end
go
select dbo.GetSubsting(3, 'abc/def gh /ijk l/m/no p/qr')
--OUTPUT
-- ijk l