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

问题描述 投票:1回答:5

我有一个视图,我想创建一个列隔离同一个字符(“ - ”)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”

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

sql-server parsing
5个回答
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
投票

分割值然后从数据中提取第二项似乎更简单。如果您的数据总是有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;

0
投票

请尝试以下查询。如果您的模式与您的问题相同,那么下面的方法就可以了。

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

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

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
推荐问答
热门问答
最新问答