2017-02-28 125 views

回答

1

一種方法是使用遞歸的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; 
+1

你的代碼是提高'CHARINDEX函數需要2〜3 arguments.' –

-1

回答工作在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 

Fiddle

+0

沒有理由通過添加出示順序來此查詢並且會根據表的索引方式在執行計劃中進行排序。 –

+0

@AlanBurstein我不會和你一起進入幼稚的戰爭。這是一個很好的答案,你因爲[this]而投了票(http://stackoverflow.com/questions/42698979/select-query-to-match-multiple-columns-with-multiple-keywords/42703934#comment72534461_42703934)。這個指數與答案無關。 –

+0

你的回答很好。如果沒有索引來處理它,執行計劃中的排序將減慢查詢速度。表現總是很重要。爲了記錄,我試圖反駁你的答案,但不能。乾杯。 –

1

如果字符串總是跟隨'..(..)'一個方法的重複圖案來解決這使用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  | 
+----+----------+ 

分割字符串參考:

+0

這是一個不錯的解決方案。似乎在數據不正確的情況下會出現問題,如'(()ab'或')))ab' - 這將返回ab,即使認爲它不在任何括號內 –

+0

@ t-clausen.dk這是真的,我試圖告誡,用我的答案的第一行「如果字符串總是遵循''..(..)''」的重複模式 – SqlZim

相關問題