2014-07-01 51 views
0

我對其中包含的格式字符串一個SQL表中的列:SQL分割字符串

Provider - Category: General: Entry (1) 

我想創建分裂到這4列給出這樣的結果的SQL語句:

Column1 | Column2 | Column3  | Column4 
---------------------------------------------- 
Provider | Category | General: Entry | 1 

這將需要通過-第一:拆分,然後我通過(猜然後,最後取下)

如何去創建類似的東西?

+1

您正在使用哪些DBMS? –

+0

數據總是相同嗎?或者他們可以改變?如果標點符號可能會改變。 – DNac

+0

使用SQL 2012,我剛剛注意到,有時數據可能在'General:Entry(HD)(1)'中有另一組圓括號' –

回答

2

如果數據具有相同的結構,這個查詢應該工作:

DECLARE @TEXT VARCHAR(255) = 'Provider - Category: General: Entry (1)'; 

SELECT SUBSTRING(@TEXT,1,CHARINDEX('-',@TEXT)-1) AS COL1 
,SUBSTRING(@TEXT,CHARINDEX('-',@TEXT)+2,CHARINDEX(':',@text)- 2 - CHARINDEX('-',@text)) AS COL2 
,SUBSTRING(@TEXT,CHARINDEX(':',@TEXT)+2,CHARINDEX('(',@TEXT)- 2 - CHARINDEX(':',@TEXT)) AS COL3 
,SUBSTRING(@TEXT,CHARINDEX('(',@TEXT)+1,CHARINDEX(')',@TEXT)- 1 - CHARINDEX('(',@TEXT)) AS COL4 

輸出:

Col1  Col2  Col3    Col4 
Provider Category General: Entry  1 

編輯基於評論:

DECLARE @TEXT VARCHAR(255) = 'Provider - Category: General: Entry (HD) (1)'; 

SELECT SUBSTRING(@TEXT,1,CHARINDEX('-',@TEXT)-1) AS COL1 
,SUBSTRING(@TEXT,CHARINDEX('-',@TEXT)+2,CHARINDEX(':',@text)- 2 - CHARINDEX('-',@text)) AS COL2 
,SUBSTRING(@TEXT,CHARINDEX(':',@TEXT)+2,CHARINDEX('(',@TEXT)- 2 - CHARINDEX(':',@TEXT)) AS COL3 
--,SUBSTRING(@TEXT,CHARINDEX('(',@TEXT)+1,CHARINDEX(')',@TEXT)- 1 - CHARINDEX('(',@TEXT)) AS COL4 
,REVERSE(SUBSTRING(REVERSE(@TEXT),2,CHARINDEX('(',(REVERSE(@TEXT))) - CHARINDEX(')',REVERSE(@TEXT))-1)) as COL4 

有了這一點,不不管你是否有'Provider - Category: General: Entry (HD) (1)''Provider - Category: General: Entry (HD) (1)',輸出是無論如何:

Col1  Col2  Col3    Col4 
Provider Category General: Entry  1 

它唯一不包含(HD)。但是,您可以將兩個解決方案與@TEXT NOT LIKE '%HD%'@TEXT LIKE '%HD%'結合,然後使用UNION ALL作爲解決方法。

+0

一旦它們相同,但看起來好像是'Provider - Category:General:Entry (HD)(1)'有時會發生,將在最後一列中放置HD而不是1,其中Column3應該是'General:Entry(HD)'。有沒有辦法將最後一個子字符串改爲lastIndexOf「(」? –

+0

查看更新後的答案。「(HD)」有多重要?我認爲這些查詢可以爲您提供如何完成任務的基本方法。 – DNac