這是我的表如何獲得價值
123 | 123-456-345
234 | 332-433
221 | 221
這就是我想要得到
123 | 123
123 | 456
123 | 345
234 | 332
234 | 433
221 | 221
這是我的表如何獲得價值
123 | 123-456-345
234 | 332-433
221 | 221
這就是我想要得到
123 | 123
123 | 456
123 | 345
234 | 332
234 | 433
221 | 221
隨着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()
進行查詢,以獲得所有項目一個接一個
後,如果您正在使用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,'-')
如果你正在使用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);
但是你應該真的解決您的數據模型。將分隔字符串存儲在單個列中是一個非常糟糕的主意。
對於這裏的甲骨文11g是一個簡單的解決方案(只是你的表名和num
與取代tab
,str
您-列名):
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
你能告訴我們你到目前爲止嘗試過什麼嗎? –
你的RDBMS是什麼? – Petaflop
此問題已被問到:[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