我有一個select語句下面的格式 - 返回數據(從壞的數據庫設計)行添加到結果從逗號分隔的數據集
ID Numbers
3 6,7,8
,我需要調整它返回
ID Number
3 6
3 7
3 8
來修復它。什麼是最好的方法來做到這一點?我不需要一個永久的函數,我只需要一個select查詢的結果集導入到一個新的數據庫中。
謝謝!
我有一個select語句下面的格式 - 返回數據(從壞的數據庫設計)行添加到結果從逗號分隔的數據集
ID Numbers
3 6,7,8
,我需要調整它返回
ID Number
3 6
3 7
3 8
來修復它。什麼是最好的方法來做到這一點?我不需要一個永久的函數,我只需要一個select查詢的結果集導入到一個新的數據庫中。
謝謝!
由於您使用的SQL Server 2015年,最好的選擇是寫一個UDF像這樣:
CREATE FUNCTION [dbo].[udfSplit]
(
@sInputList VARCHAR(8000) -- List of delimited items
,
@sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
)
RETURNS @List TABLE (item VARCHAR(8000))
BEGIN
DECLARE @sItem VARCHAR(8000);
WHILE CHARINDEX(@sDelimiter, @sInputList, 0) <> 0
BEGIN
SELECT @sItem = RTRIM(LTRIM(SUBSTRING(@sInputList, 1,
CHARINDEX(@sDelimiter,
@sInputList, 0)
- 1))) ,
@sInputList = RTRIM(LTRIM(SUBSTRING(@sInputList,
CHARINDEX(@sDelimiter,
@sInputList, 0)
+ LEN(@sDelimiter),
LEN(@sInputList))));
IF LEN(@sItem) > 0
INSERT INTO @List
SELECT @sItem;
END;
IF LEN(@sInputList) > 0
INSERT INTO @List
SELECT @sInputList; -- Put the last item in
RETURN;
END;
並使用它像這樣:
SELECT ID ,
item
FROM (SELECT 3 AS ID ,
'6,7,8' AS Numbers
) x
CROSS APPLY udfSplit(x.Numbers, ',');
有一個類似的功能,但在Tally方法的性能增益方面是AMAZED。即使XML方法比LOOP更具性能 –
如果有興趣,我將演示一種內聯XML方法和一個計數方法https://stackoverflow.com/questions/43082763/want-a-stored-procedure-for-comma -seperated-string-which-of-column-has-200/43082930#43082930 –
@Icarus - 漂亮的功能謝謝你。我需要從現有表格中提取ID和數字。我沒有任何運氣在任何地方插入from子句。將「from」放在內部select子句中會導致每個ID有多行,但仍然以數字形式分隔字符串。 – jodeenm
試試這個:
DECLARE @YourTable Table (
ID INT IDENTITY(1,1)
, Number VARCHAR(10)
)
INSERT INTO @YourTable
VALUES
('1,2,3')
, ('4,5,6,7')
, ('8,9')
, ('10')
;WITH CTE
AS
(
SELECT 1 AS ID
UNION ALL
SELECT ID + 1 FROM CTE
WHERE ID < 100
)
SELECT
x.ID
, SUBSTRING(x.Number, t.ID, CHARINDEX(',', x.Number + ',', t.ID) - t.ID) AS Number
FROM @YourTable x
JOIN CTE t
ON t.ID <= DATALENGTH(x.Number)+1
AND SUBSTRING(',' + x.Number, t.ID, 1) = ','
ORDER BY ID, Number
更多信息可以在這裏找到:http://www.sqlservercentral.com/articles/Tally+Table/72993/
您是使用MySQL或MS SQL Server還是Sybase?答案將取決於所使用的dbms。 – jarlh
順便說一句,最後編輯沒有太大的好處...... – jarlh
不知道SQL Server 2015.如果2016年看一看string_split() –