将字符串拆分为列

时间:2019-12-16 23:25:50

标签: sql-server tsql split

我想在字符串下面分割:

 @string = '?Reqid=325235&step=5&substep=13'

所需的输出:

String                              Key   step substep 
?Reqid=325235&step=5&substep=13   325235   5     13

编辑:

到目前为止,我已经尝试过

declare @string varchar(100) = '?Reqid=325235&step=5&substep=13'

select @string String,

       substring(@string, len('?reqID=') + 1, (CHARINDEX('&step=', @string) - (len('?reqID=') + 1))) key,
       0 Step,
       0 SubStep

我无法找到其余的列

当前结果:

String                              Key   step substep 
?Reqid=325235&step=5&substep=13   325235   0    0

6 个答案:

答案 0 :(得分:4)

SQL-Server不太适合此任务,但是围绕使用JSON(2016+版本)或XML(从v2005开始)进行的工作非常不错:

DECLARE @string VARCHAR(100) = '?Reqid=325235&step=5&substep=13';

-JSON方法(需要v2016 +)

SELECT *
FROM OPENJSON(CONCAT('{"',REPLACE(REPLACE(STUFF(@string,1,1,''),'&','","'),'=','":"'),'"}'))
WITH(Reqid INT
    ,step INT
    ,substep INT);

-XML方法(适用于旧版本)

SELECT A.CastedToXml.value('(x/@Reqid)[1]','int') As Reqid
      ,A.CastedToXml.value('(x/@step)[1]','int') As step
      ,A.CastedToXml.value('(x/@substep)[1]','int') As substep
FROM (SELECT CAST('<x ' + REPLACE(REPLACE(STUFF(@string,1,1,''),'=','="'),'&','" ') + '" />'  AS XML)) A(CastedToXml);

简而言之:

使用一些简单的字符串操作,我们可以将字符串转换为JSON

{"Reqid":"325235","step":"5","substep":"13"}

或XML

<x Reqid="325235" step="5" substep="13" />

结合OPENJSON子句(隐式透视),使用WITH完成JSON的读取。使用XML的类型方法.value()读取XML的属性。

答案 1 :(得分:1)

SQL Server 真的缺少正则表达式功能,这种类型的字符串操作可能会在应用程序端得到更好的处理。

话虽如此,假设键始终处于相同顺序,则可以执行以下操作:

select 
    substring(
        @string, 
        charindex('Reqid=', @string) + len('Reqid='), 
        charindex('&', @string) 
            - charindex('Reqid=', @string) 
            - len('Reqid=')
    ) [key],
    substring(
        @string, 
        charindex('step=', @string) + len('step='), 
        charindex('&', @string, charindex('step=', @string) + len('step=')) 
            - charindex('step=', @string) 
            - len('step=')
    ) step,
    right(
        @string, 
        len(@string) - charindex('substep=', @string) - len('substep=') + 1
    ) substep

Demo on DB Fiddle

key    | step | substep
:----- | :--- | :------
325235 | 5    | 13     

答案 2 :(得分:1)

假设您的字符串(URL)为固定格式,则以下内容将提取所需的信息:

declare @string varchar(100) = '?Reqid=325235&step=5&substep=13';

select
  substring(@string, End1+1, Start2-End1-1) ReqID
  , substring(@string, End2+1, Start3-End2-1) Step
  , substring(@string, End3+1, EndEnd-End3-1) SubStep
from (
  select @string String
    , charindex('?reqID=', @string) Start1
    , charindex('?reqID=', @string) + 6 End1
    , charindex('&step=', @string) Start2
    , charindex('&step=', @string) + 5 End2
    , charindex('&substep=', @string) Start3
    , charindex('&substep=', @string) + 8 End3
    , len(@string)+1 EndEnd
) X;

结果:

ReqID   Step    SubStep
325235  5       13

答案 3 :(得分:0)

这可能会帮助

select @string String,
substring(@string, len('?reqID=') + 1, (CHARINDEX('&step=', @string) - (len('?reqID=') + 1))) [Key],
SUBSTRING(@string, CHARINDEX('&step=', @string) + len('&step='), CHARINDEX('&substep', @string) - CHARINDEX('&step=', @string) - len('&step=')) Step,
SUBSTRING(@string, CHARINDEX('&substep=', @string) + len('&substep='), len(@string) - charindex('&substep=', @string)) Step

答案 4 :(得分:0)

如果您使用的是SQL Server 2016或更高版本,则可以使用STRING_SPLIT函数以字符分隔字符串。请参阅下面的完整查询。

declare @string varchar(100) = '?Reqid=325235&step=5&substep=13', @c nchar(1) = N'='

SELECT @string AS [String], [1] AS [Key], [2] AS [step], [3] AS [substep]
FROM  
(
  SELECT TOP 100 PERCENT
  Val = substring(value, 0, charindex('&', value)), 
  R = ROW_NUMBER() OVER ( ORDER BY CHARINDEX(@c + value + @c, @c + @string + @c)  )
  FROM STRING_SPLIT(@string + '&', @c)  
  WHERE RTRIM(value)  '?Reqid'
  ORDER BY R
)
AS SourceTable  
PIVOT (  MAX(Val) FOR R IN ([1], [2], [3]) ) AS PivotTable; 


Demo on SQL Fiddle

+---------------------------------+-----+--------+---------+
|             String              | Key |  step  | substep |
+---------------------------------+-----+--------+---------+
| ?Reqid=325235&step=5&substep=13 |  13 | 325235 |       5 |
+---------------------------------+-----+--------+---------+

更新:由于STRING_SPLIT不保证结果的顺序,因此我使用了ROW_NUMBER()函数使顺序一致。 =的字符索引用于此目的。

答案 5 :(得分:0)

这是一个非常简单的选项,应该易于理解:

DECLARE @string varchar(max) = '?Reqid=325235&step=5&substep=13';

DECLARE @RemainingString varchar(max) = SUBSTRING(@string, 8, LEN(@string));
DECLARE @AmpersandLocation int = CHARINDEX('&', @RemainingString);
DECLARE @Key varchar(100) = SUBSTRING(@RemainingString, 1, @AmpersandLocation - 1);
SET @RemainingString = SUBSTRING(@RemainingString, LEN(@Key) + 7, LEN(@RemainingString));
SET @AmpersandLocation = CHARINDEX('&', @RemainingString);
DECLARE @Step varchar(100) = SUBSTRING(@RemainingString, 1, @AmpersandLocation - 1);
DECLARE @Substep varchar(100) = SUBSTRING(@RemainingString, LEN(@Step) + 10, LEN(@RemainingString));

SELECT @string AS [String], @Key AS [Key], @Step AS [Step], @Substep AS Substep;