我想在字符串下面分割:
@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
答案 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
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;
+---------------------------------+-----+--------+---------+ | 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;