2016-09-09 159 views
-1

這是我的表如何獲得價值

123 | 123-456-345 
234 | 332-433 
221 | 221 

這就是我想要得到

123 | 123 
123 | 456 
123 | 345 
234 | 332 
234 | 433 
221 | 221 
+0

你能告訴我們你到目前爲止嘗試過什麼嗎? –

+5

你的RDBMS是什麼? – Petaflop

+0

此問題已被問到:[MySql](http://stackoverflow.com/questions/17942508/sql-split-values-to-multiple-rows),[SQL Server](http://stackoverflow.com/questions/5493510 /將逗號分隔的字符串轉換爲單獨的行),[Oracle](http://stackoverflow.com/questions/14328621/splitting-string-into-multiple-rows-in- oracle),... – trincot

回答

2

隨着SQL-Server,則可以這樣做的結果是:

DECLARE @tbl TABLE(ID INT,YourString VARCHAR(MAX)); 
INSERT INTO @tbl VALUES(123,'123-456-345'),(234,'332-433'),(221,'221'); 

SELECT tbl.ID 
     ,x.value('.','int') AS Value 
FROM @tbl AS tbl 
CROSS APPLY(SELECT CAST('<x>' + REPLACE(YourString,'-','</x><x>') + '</x>' AS XML)) AS Casted(AsXml) 
CROSS APPLY Casted.AsXml.nodes('/x') AS A(x) 

訣竅是,將您的字符串123-456-345轉換爲有效的XML,並使用簡單的替換-<x>123</x><x>456</x><x>345</x>

這個XML可以使用.nodes()進行查詢,以獲得所有項目一個接一個

0

後,如果您正在使用SQL Server 2016使用STRING_SPLIT功能。

SELECT ID, value 
FROM Yourtable 
    CROSS APPLY STRING_SPLIT([YourColumn], '-'); 

對於較低版本的SQL Server,你可以遵循什麼@shungo建議,或者您可以創建一個用戶定義的函數來分割字符串,並調用它的select語句。

CREATE FUNCTION [dbo].[SplitWords] 
( 
     @Input NVARCHAR(MAX), 
     @Character CHAR(1) 
) 
RETURNS @Output TABLE (
     Item NVARCHAR(1000) 
) 
AS 
BEGIN 
     DECLARE @StartIndex INT, @EndIndex INT 

     SET @StartIndex = 1 
     IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character 
     BEGIN 
      SET @Input = @Input + @Character 
     END 

     WHILE CHARINDEX(@Character, @Input) > 0 
     BEGIN 
      SET @EndIndex = CHARINDEX(@Character, @Input) 

      INSERT INTO @Output(Item) 
      SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1) 

      SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input)) 
     END 

     RETURN 
END 

寫下面的腳本。

SELECT ID,Item 
FROM Yourtable 
CROSS APPLY [SplitWords] (YourColumn,'-') 
0

如果你正在使用Postgres的你可以使用string_to_array()unnest()

select t.id, x.val 
from the_table t 
    cross join lateral unnest(string_to_array(the_column), '-') as x(val); 

但是你應該真的解決您的數據模型。將分隔字符串存儲在單個列中是一個非常糟糕的主意。

0

對於這裏的甲骨文11g是一個簡單的解決方案(只是你的表名num取代tabstr您-列名):

WITH 
tab1 AS (
SELECT num, SUBSTR(str,1,3) str FROM tab 
UNION ALL 
SELECT num, SUBSTR(str,5,3) str FROM tab 
UNION ALL 
SELECT num, SUBSTR(str,9,3) str FROM tab 
) 
SELECT * 
FROM tab1 
WHERE str IS NOT NULL 

它給我造成作者:

1 123 123 
2 123 345 
3 123 456 
4 221 221 
5 234 332 
6 234 433