2017-04-11 97 views
0

我有一個字符串,如'(ST1)今天是星期二,(ST2) - CCC,yao(ST3)'。我想檢索所有以ST開頭的單詞然後插入到臨時表中。在這種情況下,臨時表將有3行,包括ST1,ST2和ST3。有沒有什麼好的方法來實現這個目標?謝謝。我正在使用SQL Server 2008,T-SQL是我的語言。在T-SQL中檢索字符串中的幾個字

+0

定義你的意思。你怎麼知道一個「單詞」的開始和結束。 –

+0

期望值位於開始和結束括號之間嗎? –

+0

@SeanLange對不起,我沒有明確提及它。開始和結束括號之間應該有一個詞。 –

回答

1

假設每個「單詞」就是你在括號之間所擁有的,你可以很容易地使用字符串分隔符。我正在使用來自sql server central.com的Jeff Moden的分離器。你可以在這裏找到一篇文章,討論和代碼。 http://www.sqlservercentral.com/articles/Tally+Table/72993/

有很多其他偉大的分離器在那裏。 Aaron Bertrand在這裏有優秀的文章和收藏。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings

declare @SomeString varchar(100) = '(ST1) today is Tuesday,(ST2)--CCC,yao (ST3)' 

select s.Item 
from dbo.DelimitedSplit8K(replace(@SomeString, ')', '('), '(') s 
where Item like 'ST%' 
+0

它是有用的,並感謝您的幫助 –

1

你也可以抓住的NGrams8K副本,並做到這一點:

DECLARE @yourstring varchar(100) = '(ST1) today is Tuesday,(ST2)--CCC,yao (ST3)'; 

SELECT item = SUBSTRING(token, 2, 3) 
FROM dbo.NGrams8k(@yourstring, 5) 
WHERE token LIKE '(%)'; 

編輯:如何再處理的值比3:

DECLARE @yourstring varchar(100) = '(ST1) today is Tuesday,(ST2)--CCC,yao (ST11)!! (ST999)'; 

WITH gramSizes(s,ng) AS (SELECT 3, 5 UNION ALL SELECT 4, 6 UNION ALL SELECT 5, 7) 
SELECT item = SUBSTRING(token, 2, s) 
FROM gramSizes 
CROSS APPLY dbo.NGrams8k(@yourstring, ng) 
WHERE token LIKE '(%)'AND token NOT LIKE '%) ' 

結果:

item 
----- 
ST1 
ST2 
ST11 
ST999 
+1

這是非常聰明的艾倫。不知道我是如何錯過這篇文章的,但我肯定會添加到我的工具箱中!這裏唯一的缺點是如果「單詞」長於3個字符,這將不會返回它們。但是,如果所有單詞都恰好是3個字符,則這種方法有效並且具有更簡單的執行計劃。 –

+1

感謝您的幫助。艾倫 –

+0

不客氣艾弗森。肖恩 - 感謝客氣的話。我的意思是包含一個長於3的值的示例。我現在剛剛更新了我的答案。 –

相關問題