隔离3个字符之间的字符串

时间:2019-04-24 15:43:22

标签: sql-server parsing

我有一个视图,我想在该视图中创建一个将3个相同字符(“-”)之间的字符串隔离开的列。例如,我希望AC-RBQ/4110-WS-L1成为RBQ/4110

到目前为止,我已经尝试过了,它使我非常接近。

SELECT SUBSTRING(locnum,CHARINDEX('-',locnum)+1,(((LEN(locnum))-CHARINDEX('-', REVERSE(locnum)))-CHARINDEX('-',locnum))) AS Result

结果:

RBQ/4110-WS
RBQ/4110-CS

我只需要删除最后一个“ -WS”或“ -CS”

任何想法或想法都将不胜感激!

5 个答案:

答案 0 :(得分:4)

如果模式是一致的,那么parsename()可能是一个很好的选择

示例

Declare @S varchar(100) = 'AC-RBQ/4110-WS-L1'

Select parsename(replace(@S,'-','.'),3)

返回

RBQ/4110
  

编辑-

只要您的数据具有更多可变性,就可以使用XML提取 SECOND

示例

Declare @YourTable table (locnum varchar(100))
Insert Into @YourTable values
('AC-RBQ/4110-WS-L1')

Select NewValue = convert(xml,'<x>'+replace(locnum,'-','</x><x>')+'</x>').value('/x[2]','varchar(100)')
 From  @YourTable

返回

NewValue
RBQ/4110

答案 1 :(得分:1)

拆分值然后从数据中提取第二项似乎更简单。如果您的数据始终包含4个元素(并且始终需要第二个元素),则可以使用PARSENAME

SELECT PN.P
FROM (VALUES('AC-RBQ/4110-WS-L1'))V(S)
     CROSS APPLY (VALUES(PARSENAME(REPLACE(V.S,'-','.'),3)))PN(P); --Part 3 as PARSENAME works right to left

否则,您可以使用delimitedsplit8k_lead之类的拆分器:

SELECT DS.Item
FROM (VALUES('AC-RBQ/4110-WS-L1'))V(S)
     CROSS APPLY dbo.DelimitedSplit8K_lead(V.S,'-') DS
WHERE DS.ItemNumber = 2;

答案 2 :(得分:0)

请在下面的查询中尝试。如果每个问题的模式都相同,那么下面的方法将起作用。

select left(SUBSTRING('AC-RBQ/4110-WS-L1', charindex('-','AC-RBQ/4110-WS-L1') + 1, LEN('AC-RBQ/4110-WS-L1')),8)

答案 3 :(得分:0)

您已经完成了大部分工作,需要将结果的左半部分放到-

SELECT 
  LEFT(SUBSTRING(locnum, CHARINDEX('-', locnum) + 1,
  (((LEN(locnum)) - CHARINDEX('-', REVERSE(locnum))) - CHARINDEX('-', locnum))),
  CHARINDEX('-', SUBSTRING(locnum, CHARINDEX('-', locnum) + 1,
  (((LEN(locnum)) - CHARINDEX('-', REVERSE(locnum))) - CHARINDEX('-', locnum)))) - 1) AS Result

答案 4 :(得分:0)

WITH TEMP AS
(
SELECT 'AC-RBQ/4110-WS-L1'  AS COL
)

SELECT * ,
CHARINDEX('-', [COL]) AS FR,
CHARINDEX('-', [COL],CHARINDEX('-', [COL])+1) AS FR2,
SUBSTRING([COL], CHARINDEX('-', [COL]) +1 ,CHARINDEX('-', [COL],CHARINDEX('- 
', [COL])+1) - (CHARINDEX('-', [COL]) +1) ) AS RESULT
FROM TEMP