CREATE TABLE #StudentClasses
(
ID INT,
Student VARCHAR(100),
Classes VARCHAR(100),
CCode VARCHAR(30)
)
GO
INSERT INTO #StudentClasses
SELECT 1, 'Mark', 'Maths,Science,English', 'US,UK,AUS'
UNION ALL
SELECT 2, 'John', 'Science,English', 'BE,DE'
UNION ALL
SELECT 3, 'Robert', 'Maths,English', 'CA,IN'
GO
SELECT *
FROM #StudentClasses
GO
SELECT ID, Student, value ,value
FROM #StudentClasses
CROSS APPLY STRING_SPLIT(Classes, ',')
CROSS APPLY STRING_SPLIT(CCode, ',')
答案 0 :(得分:2)
这必须放在首位:不要存储定界数据!如果有机会更改表的设计,则应使用相关的侧表来存储这种数据...
您的问题并不比以前的问题好得多。没有您的预期结果,任何建议都必须是猜测。
我猜:您想以某种方式转换'Maths,Science,English', 'US,UK,AUS'
,以使数学与美国,科学与英国以及英语相匹配,从而与AUS相匹配。试试这个
SELECT sc.ID
,sc.Student
,A.[key] AS Position
,A.[value] AS Class
,B.[value] AS CCode
FROM #StudentClasses sc
CROSS APPLY OPENJSON('["' + REPLACE(Classes,',','","') + '"]') A
CROSS APPLY OPENJSON('["' + REPLACE(CCode,',','","') + '"]') B
WHERE A.[key]=B.[key];
您没有告诉我们您的SQL Server版本...但是您使用Azure标记。因此,我认为v2016对您来说还可以。如果版本较低(或给定数据库的兼容性级别较低),则不支持JSON。
为什么要使用JSON?这是目前分割CSV数据并获取片段及其在数组中的位置的最佳方法。遗憾的是,STRING_SPLIT()
不保证会返回预期的订单。对于低于v2016的版本,有一些或多或少的丑陋窍门...
如果您需要结果并排,则应阅读有关条件汇总的信息。
答案 1 :(得分:0)
使用全选或使用别名
CREATE TABLE #StudentClasses
(ID INT, Student VARCHAR(100), Classes VARCHAR(100),CCode varchar(30))
INSERT INTO #StudentClasses
SELECT 1, 'Mark', 'Maths,Science,English', 'US,UK,AUS'
UNION ALL
SELECT 2, 'John', 'Science,English', 'BE,DE'
UNION ALL
SELECT 3, 'Robert', 'Maths,English', 'CA,IN'
SELECT *,v1.value as clases,v2.value as codes
FROM #StudentClasses
CROSS APPLY STRING_SPLIT(Classes, ',') v2
CROSS APPLY STRING_SPLIT(CCode,
',') v1