为了拆分分隔的字符串,我需要创建一个函数,返回一个表并以逗号分隔的字符串作为参数。
例如,看一下这个输入表:
使用该功能,结果如下:
在这种情况下,分隔的字符串是Person列,应该作为参数。
提前致谢。
答案 0 :(得分:1)
试试这个
--Build Schema for Your Case
DECLARE @TAB TABLE (ID INT, NAME VARCHAR(1000))
INSERT INTO @TAB
SELECT 1,'Pravesh,Simon'
UNION ALL
SELECT 2,'Me,Myself,I'
--Used Recursive CTE to achieve Tabular view of Comma Separated Column
--Used While loop to take next row
--Used Table Variable @RESULT to store your Result Set
DECLARE @ID INT, @T VARCHAR(100), @SNO INT= 1, @MAX_SNO INT
DECLARE @RESULT TABLE (ID INT, NAME VARCHAR(1000))
SELECT @SNO=1, @MAX_SNO =MAX(ID) FROM @TAB
WHILE(@SNO<=@MAX_SNO)
BEGIN
SELECT @ID = ID, @T = NAME FROM @TAB WHERE ID=@SNO
SET @T =@T+','
;WITH MyCTE(Start,[End]) AS(
SELECT 1 AS Start,CHARINDEX(',',@T,1) AS [End]
UNION ALL
SELECT [End]+1 AS Start,CHARINDEX(',',@T,[End]+1)AS [End]
from MyCTE where [End]<LEN(@T)
)
INSERT INTO @RESULT
Select @SNO AS ID, SUBSTRING(@T,Start,[End]-Start) NAME from MyCTE;
SET @SNO+=1
END
--Getting Result Set
SELECT * FROM @RESULT
编辑:来自您的评论
如果你想用一个函数做上面的事情,这个比上面的循环容易。
CREATE FUNCTION [DBO].[FN_SPLIT_STR_TO_COL] (@T AS VARCHAR(4000) )
RETURNS
@RESULT TABLE(VALUE VARCHAR(250))
AS
BEGIN
SET @T= @T+','
;WITH MYCTE(START,[END]) AS(
SELECT 1 AS START,CHARINDEX(',',@T,1) AS [END]
UNION ALL
SELECT [END]+1 AS START,CHARINDEX(',',@T,[END]+1)AS [END]
FROM MYCTE WHERE [END]<LEN(@T)
)
INSERT INTO @RESULT
SELECT SUBSTRING(@T,START,[END]-START) NAME FROM MYCTE;
RETURN
END
现在只需通过将列传递给它来调用每一行的函数。
使用Cross Apply
SELECT ID,FN_RS.VALUE FROM @TAB
CROSS APPLY
(SELECT * FROM [DBO].[FN_SPLIT_STR_TO_COL] (NAME)) AS FN_RS
答案 1 :(得分:0)
尝试这个查询
//Which will work only when having 3 comma only
SELECT Id,SUBSTRING_INDEX(SUBSTRING_INDEX(`Person`, ',', 1), ',', -1) as Person
FROM `table`
UNION
select Id,SUBSTRING_INDEX(SUBSTRING_INDEX(`Person`, ',', 2), ',', -1) as Person
FROM `table`
UNION
select Id,SUBSTRING_INDEX(SUBSTRING_INDEX(`Person`, ',', 3), ',', -1) as Person
FROM `table`
order by Id ASC
答案 2 :(得分:0)
($ 3) :: Num a => (a -> b) -> b