如何提取字段中第二组“-”破折号之间的 SQL 字符串值
How to Extract in SQL string value between the 2nd set of '-' dashes in a field
*例如,我试图在第二组“-”之间提取值
RNDC007-PS-160958205220402-1-A.pdf
应该拉160958205220402
1883626-FA-2011978300304402-12-A.pdf
应该拉2011978300304402
下面是我的代码,但我在值的每一侧都使用 -
获取值。
例如:-2011978300304402-
另外,当我针对 table 的所有记录 运行 时,我得到错误:
Invalid length parameter passed to the LEFT or SUBSTRING function.
我认为 Case 语句会解决这个问题,但事实并非如此。
在此先感谢您的帮助!
我的代码:
SELECT [ID]
,[T_File]
,[OrderNumber]
,[CustOrdNumber]
,[LineSeqNum]
,[SKU]
,[WebLineNum]
,CASE WHEN [T_File] LIKE '%.pdf%' THEN SUBSTRING([T_File],CHARINDEX('-', [T_File], CHARINDEX('-', [T_File]) + 1) -0,LEN([T_File]) - CHARINDEX('-', [T_File], CHARINDEX('-', [T_File]) + 1) - CHARINDEX('-', REVERSE(Rtrim([T_File])))) ELSE '' END AS PulledString
FROM [Portal].[dbo].[PA_URL]
这是使用 Charindex
和 NULLIF
的一种方法
SELECT Substring(string, scd + 1, NULLIF(trd, 0) - NULLIF(scd, 0) - 1) AS result
FROM (SELECT string,
Charindex('-', string) AS fst
FROM (VALUES('RNDC007-PS-160958205220402-1-A.pdf'),
('1883626-FA-2011978300304402-12-A.pdf'),
('1883626-FA') -- bad data
)tc(string)) a
CROSS apply(VALUES (Charindex('-', string, NULLIF(fst, 0) + 1))) b (scd)
CROSS apply(VALUES (Charindex('-', string, NULLIF(scd, 0) + 1))) c (trd)
对于不良记录结果将是NULL
结果:
result
---------------
160958205220402
2011978300304402
NULL
另一种选择是 CROSS APPLY
加一点 XML。默认情况下,XML 将解析 5 个位置,但是,如您所见,它很容易扩展或收缩——本质上可以减少到 Pos2 = ...
Declare @YourTable table (ID int,T_File varchar(250))
Insert Into @YourTable values
(1,'RNDC007-PS-160958205220402-1-A.pdf should pull "160958205220402"'),
(2,'1883626-FA-2011978300304402-12-A.pdf should pull "2011978300304402"')
Select A.ID
,B.*
From @YourTable A
Cross Apply (
Select Pos1 = xDim.value('/x[1]','varchar(max)')
,Pos2 = xDim.value('/x[2]','varchar(max)')
,Pos3 = xDim.value('/x[3]','varchar(max)')
,Pos4 = xDim.value('/x[4]','varchar(max)')
,Pos5 = xDim.value('/x[5]','varchar(max)')
From (Select Cast('<x>' + replace((Select T_File as [*] For XML Path('')),'-','</x><x>')+'</x>' as xml) as xDim) as A
) B
Returns
*例如,我试图在第二组“-”之间提取值
RNDC007-PS-160958205220402-1-A.pdf
应该拉160958205220402
1883626-FA-2011978300304402-12-A.pdf
应该拉2011978300304402
下面是我的代码,但我在值的每一侧都使用 -
获取值。
例如:-2011978300304402-
另外,当我针对 table 的所有记录 运行 时,我得到错误:
Invalid length parameter passed to the LEFT or SUBSTRING function.
我认为 Case 语句会解决这个问题,但事实并非如此。 在此先感谢您的帮助!
我的代码:
SELECT [ID]
,[T_File]
,[OrderNumber]
,[CustOrdNumber]
,[LineSeqNum]
,[SKU]
,[WebLineNum]
,CASE WHEN [T_File] LIKE '%.pdf%' THEN SUBSTRING([T_File],CHARINDEX('-', [T_File], CHARINDEX('-', [T_File]) + 1) -0,LEN([T_File]) - CHARINDEX('-', [T_File], CHARINDEX('-', [T_File]) + 1) - CHARINDEX('-', REVERSE(Rtrim([T_File])))) ELSE '' END AS PulledString
FROM [Portal].[dbo].[PA_URL]
这是使用 Charindex
和 NULLIF
SELECT Substring(string, scd + 1, NULLIF(trd, 0) - NULLIF(scd, 0) - 1) AS result
FROM (SELECT string,
Charindex('-', string) AS fst
FROM (VALUES('RNDC007-PS-160958205220402-1-A.pdf'),
('1883626-FA-2011978300304402-12-A.pdf'),
('1883626-FA') -- bad data
)tc(string)) a
CROSS apply(VALUES (Charindex('-', string, NULLIF(fst, 0) + 1))) b (scd)
CROSS apply(VALUES (Charindex('-', string, NULLIF(scd, 0) + 1))) c (trd)
对于不良记录结果将是NULL
结果:
result
---------------
160958205220402
2011978300304402
NULL
另一种选择是 CROSS APPLY
加一点 XML。默认情况下,XML 将解析 5 个位置,但是,如您所见,它很容易扩展或收缩——本质上可以减少到 Pos2 = ...
Declare @YourTable table (ID int,T_File varchar(250))
Insert Into @YourTable values
(1,'RNDC007-PS-160958205220402-1-A.pdf should pull "160958205220402"'),
(2,'1883626-FA-2011978300304402-12-A.pdf should pull "2011978300304402"')
Select A.ID
,B.*
From @YourTable A
Cross Apply (
Select Pos1 = xDim.value('/x[1]','varchar(max)')
,Pos2 = xDim.value('/x[2]','varchar(max)')
,Pos3 = xDim.value('/x[3]','varchar(max)')
,Pos4 = xDim.value('/x[4]','varchar(max)')
,Pos5 = xDim.value('/x[5]','varchar(max)')
From (Select Cast('<x>' + replace((Select T_File as [*] For XML Path('')),'-','</x><x>')+'</x>' as xml) as xDim) as A
) B
Returns