2015-10-28 97 views
0

我有一個字符串,其座標如下:'0 0,1 2,3 4,0 0',我想將它分成兩列x和y。帶有兩個分隔符的SQL Server分割函數

結果我想收到:

enter image description here

我發現T-SQL一個解決方案,但遺憾的是SQL Server沒有分裂功能編碼,我也發現了一些功能來做到這一點,但僅適用於一種分隔符,我不能自己'升級',這是我從SQL開始的。

請幫助;)

+0

這不在sql的範圍之內。它沒有這個功能,因爲你不應該需要一個...使用編程語言來實現它。 –

+0

http://stackoverflow.com/questions/28772227/tsql-nested-split-parse-of-string-into-table-multiple-concatenated-tagvalue-i/28773089#28773089 – ashveli

回答

0

要弄完,你需要首先將數據從,分成行,然後所有的行分成兩列。

要將數據拆分成行,您可以使用例如Jeff Moden的DelimitedSplit8k函數。

一旦你有了行,你就可以用charindex定位空間,並使用left和substring函數來獲取這些部分。

0

這裏我使用遞歸CTE

SqlFiddleDemo

;WITH tmp(id, DataItem, coord) as (
    SELECT id, 
      LEFT(coord, CHARINDEX(', ', coord + ', ')-1), 
      STUFF(coord, 1, CHARINDEX(', ', coord + ', ')+1 , '') 
    FROM coordinates  
    UNION ALL 
    SELECT id, 
      LEFT(coord, CHARINDEX(', ', coord + ', ')-1), 
      STUFF(coord, 1, CHARINDEX(', ', coord +', ')+1, '') 
    FROM tmp 
    WHERE coord > '' 
) 
SELECT id, 
     DataItem, 
     coord, 
     SUBSTRING(DataItem, 1, CASE CHARINDEX(' ', DataItem) WHEN 0 THEN LEN(DataItem) ELSE CHARINDEX(' ', DataItem)-1 END) AS X, 
     SUBSTRING(DataItem, CASE CHARINDEX(' ', DataItem) WHEN 0 THEN LEN(DataItem)+1 ELSE CHARINDEX(' ', DataItem)+1 END, 1000) AS Y 
FROM tmp 
ORDER BY id 

OUTPUT

| id | DataItem |   coord | X | Y | 
|----|----------|---------------|---|---| 
| 1 |  0 0 | 1 2, 3 4, 0 0 | 0 | 0 | 
| 1 |  1 2 |  3 4, 0 0 | 1 | 2 | 
| 1 |  3 4 |   0 0 | 3 | 4 | 
| 1 |  0 0 |    | 0 | 0 |