从字符串中斜杠'/'之前和之后打印子字符串

时间:2017-09-07 13:06:03

标签: sql-server sql-server-2008 sql-server-2012 sql-server-2008-r2

我有一项任务是根据字符串中斜线'/'位置的出现从字符串中打印子字符串.Below我试图向您展示我想要的一个示例示例。

cells

从上面的字符串我想根据斜线发生的位置打印子字符串值。 例如:有时我被要求在第二次出现slah之后打印子字符串然后我要显示Declare @My_string = 'abc/def gh /ijk l/m/no p/qr 有时我被要求在第三次出现之后打印子字符串然后{ {1}}如果是第一个,则显示ijk l,反之亦然。根据需要,没有特定的发生位置可能会有所不同。我怎样才能实现它。任何帮助都会非常感激

注意:我想在不使用函数的情况下实现.i知道可以通过使用split函数来完成。可以不使用它来实现

3 个答案:

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

You can see a live demo on rextester.

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