如何在单个查询中选择2个交叉拆分字符串列

时间:2019-06-18 06:53:50

标签: sql tsql azure-sql-database

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, ',')

2 个答案:

答案 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