如何提取字段中第二组“-”破折号之间的 SQL 字符串值

How to Extract in SQL string value between the 2nd set of '-' dashes in a field

*例如,我试图在第二组“-”之间提取值

下面是我的代码,但我在值的每一侧都使用 - 获取值。

例如:-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]

这是使用 CharindexNULLIF

的一种方法
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