我需要在連續重複多次的2個特定字符之間提取多個字符串。例如, ; 這些都是從我的表2行:獲取字符串,在sql server中重複多次的2個字符
id myString
1 'aaa(bb)ccc(ddd)'
2 'eeee(ff)gggg(hhh)iii'
我預期的結果是:
id myString
1 bb
1 ddd
2 ff
2 hhh
我該怎麼辦呢?
在此先感謝。
我需要在連續重複多次的2個特定字符之間提取多個字符串。例如, ; 這些都是從我的表2行:獲取字符串,在sql server中重複多次的2個字符
id myString
1 'aaa(bb)ccc(ddd)'
2 'eeee(ff)gggg(hhh)iii'
我預期的結果是:
id myString
1 bb
1 ddd
2 ff
2 hhh
我該怎麼辦呢?
在此先感謝。
一種方法是使用遞歸的CTE:
with cte as (
select id,
left(stuff(myString, 1, charindex('(', myString), ''),
charindex(')', myString) - charindex('(', myString) - 1
) as val,
stuff(myString, 1, charindex(')', myString) + 1) as rest
from t
where myString like '%(%)%'
union all
select id,
left(stuff(rest, 1, charindex('(', rest), ''),
charindex(')', rest) - charindex('(', rest) - 1
) as val,
stuff(rest, 1, charindex(')', myString) + 1) as rest
from cte
where rest like '%(%)%'
)
select id, val
from cte;
回答工作在SQLSERVER 2016
DECLARE @t table(id int, myString varchar(40))
INSERT @t
VALUES (1,'aaa(bb)ccc(ddd)'),(2, 'eeee(ff)gggg(hhh)iii')
SELECT id, stuff(value, 1, charindex('(',value),'') myString
FROM
@t t
CROSS APPLY
STRING_SPLIT(mystring,')')
WHERE value like '%(%'
ORDER BY id
沒有理由通過添加出示順序來此查詢並且會根據表的索引方式在執行計劃中進行排序。 –
@AlanBurstein我不會和你一起進入幼稚的戰爭。這是一個很好的答案,你因爲[this]而投了票(http://stackoverflow.com/questions/42698979/select-query-to-match-multiple-columns-with-multiple-keywords/42703934#comment72534461_42703934)。這個指數與答案無關。 –
你的回答很好。如果沒有索引來處理它,執行計劃中的排序將減慢查詢速度。表現總是很重要。爲了記錄,我試圖反駁你的答案,但不能。乾杯。 –
如果字符串總是跟隨'..(..)'
一個方法的重複圖案來解決這使用Jeff Moden的CSV Splitter函數替換第二個分隔符與第一分隔符,且只得到第二組使用modulo (%
):
select
Id
, myString = x.item
from t
cross apply (
select Item = ltrim(rtrim(i.Item))
from [dbo].[delimitedsplit8K](replace(t.mystring,')','('),'(') as i
where ItemNumber%2=0
) x
測試設置:http://rextester.com/DAI48471
加入實施例輸入的3,'jjj(kkk)ll(mmm)n(ooooo)pp(qq)rr'
回報:
+----+----------+
| Id | myString |
+----+----------+
| 1 | bb |
| 1 | ddd |
| 2 | ff |
| 2 | hhh |
| 3 | kkk |
| 3 | mmm |
| 3 | ooooo |
| 3 | qq |
+----+----------+
分割字符串參考:
這是一個不錯的解決方案。似乎在數據不正確的情況下會出現問題,如'(()ab'或')))ab' - 這將返回ab,即使認爲它不在任何括號內 –
@ t-clausen.dk這是真的,我試圖告誡,用我的答案的第一行「如果字符串總是遵循''..(..)''」的重複模式 – SqlZim
你的代碼是提高'CHARINDEX函數需要2〜3 arguments.' –