如何为以下要求编写sql函数
我有一个临时表table1,其中所有列都是int类型的
table1
scoreA | scoreB | scoreC | classA |classB | classC |
假设我还有另一个同时具有nvarchar列类型的temp table2表
table2
_______name__________myFormat_________
ScoresOfAToC | 1:10,2:20,3:30 |
ClassOfAToC | 1:4,2:5,3:6 |
我将如何拆分myFormat列,并将数据从表2插入表1,以便最终输出应如下所示:
table1
scoreA | scoreB | scoreC | classA |classB | classC |
10 20 30 4 5 6
答案 0 :(得分:1)
如前所述,您只需要从组合值中分离出所需值的逻辑,就可以在CHARINDEX的帮助下使用SUBSTRING获得所需的结果。下面提供了一些示例代码-
SELECT name,
SUBSTRING(myFormat, (CHARINDEX(':',myFormat, 0))+1,(CHARINDEX(',',myFormat, 0))-((CHARINDEX(':',myFormat, 0))+1)),
SUBSTRING(myFormat, (CHARINDEX(':',myFormat,(CHARINDEX(':',myFormat,0))+1))+1,(CHARINDEX(',',myFormat, (CHARINDEX(',',myFormat, 0))+1))-((CHARINDEX(':',myFormat,(CHARINDEX(':',myFormat,0))+1))+1)),
SUBSTRING(myFormat,CHARINDEX(':',myFormat,CHARINDEX(':',myFormat,(CHARINDEX(':',myFormat,0))+1)+1)+1,LEN(myFormat))
FROM table2
此脚本的示例数据输出如下。希望您现在可以在脚本中调整此逻辑。
ScoresOfAToC 10 20 30
ClassOfAToC 4 5 6
要使所有内容合而为一,请按如下所示应用PIVOT-
SELECT
SUBSTRING(ScoresOfAToC, (CHARINDEX(':',ScoresOfAToC, 0))+1,(CHARINDEX(',',ScoresOfAToC, 0))-((CHARINDEX(':',ScoresOfAToC, 0))+1)),
SUBSTRING(ScoresOfAToC, (CHARINDEX(':',ScoresOfAToC,(CHARINDEX(':',ScoresOfAToC,0))+1))+1,(CHARINDEX(',',ScoresOfAToC, (CHARINDEX(',',ScoresOfAToC, 0))+1))-((CHARINDEX(':',ScoresOfAToC,(CHARINDEX(':',ScoresOfAToC,0))+1))+1)),
SUBSTRING(ScoresOfAToC,CHARINDEX(':',ScoresOfAToC,CHARINDEX(':',ScoresOfAToC,(CHARINDEX(':',ScoresOfAToC,0))+1)+1)+1,LEN(ScoresOfAToC)),
SUBSTRING(ClassOfAToC, (CHARINDEX(':',ClassOfAToC, 0))+1,(CHARINDEX(',',ClassOfAToC, 0))-((CHARINDEX(':',ClassOfAToC, 0))+1)),
SUBSTRING(ClassOfAToC, (CHARINDEX(':',ClassOfAToC,(CHARINDEX(':',ClassOfAToC,0))+1))+1,(CHARINDEX(',',ClassOfAToC, (CHARINDEX(',',ClassOfAToC, 0))+1))-((CHARINDEX(':',ClassOfAToC,(CHARINDEX(':',ClassOfAToC,0))+1))+1)),
SUBSTRING(ClassOfAToC,CHARINDEX(':',ClassOfAToC,CHARINDEX(':',ClassOfAToC,(CHARINDEX(':',ClassOfAToC,0))+1)+1)+1,LEN(ScoresOfAToC)),
ScoresOfAToC,
ClassOfAToC
FROM
(
SELECT name,myFormat FROM table2
)AS A
PIVOT
(
MAX(myFormat) FOR Name in ([ScoresOfAToC],[ClassOfAToC])
)PVT