Как выбрать 2 столбца с разделенной строкой в ​​одном запросе - PullRequest
0 голосов
/ 18 июня 2019
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 ]

2 голосов
/ 18 июня 2019

Это нужно поставить на первое место: не хранить данные с разделителями! Если есть возможность изменить дизайн вашей таблицы, вы должны использовать соответствующие дополнительные таблицы для хранения данных такого рода ...

Ваш вопрос не намного лучше, чем предыдущий. Без вашего ожидаемого результата любое предложение должно быть угаданным.

Что я предполагаю: вы хотите преобразовать '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 есть несколько более или менее уродливых трюков ...

Если вам нужен ваш результат рядом , вам следует прочитать о условной агрегации .

0 голосов
/ 18 июня 2019

использовать выбрать все или использовать псевдоним

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...