我有一个视图,我想在该视图中创建一个将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”
任何想法或想法都将不胜感激!
答案 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