Один из возможных подходов - использовать функции STRING_SPLIT()
и STRING_AGG()
для разделения ParLab
значений и агрегирования данных:
Таблица:
CREATE TABLE TableA (
ParLab varchar(10),
Mcode varchar(50),
Entry varchar(50)
)
INSERT INTO TableA
(ParLab, Mcode, Entry)
VALUES
('L;58', '9LL', '948487'),
('L;58', '3B2', '563467'),
('L;58', '2AN', 'e@y.com'),
('L;80', '9LL', '938745'),
('T;80', '2AN', 'd@g.com'),
('T;88', '9LL', '827120'),
('L;80', '2AN', 'd@m.com'),
('T;88', '9LL', 'k@g.com'),
('A;47;2', '2AN', '928233')
CREATE TABLE TableB (
Customer varchar(50),
Lab varchar(50)
)
INSERT INTO TableB
(Customer, Lab)
VALUES
('Lynn' , 58),
('Laurence', 80),
('Emmanuel', 88)
Оператор:
SELECT
b.Customer,
b.Lab,
STRING_AGG(CASE WHEN CHARINDEX('@', Entry) = 0 THEN Entry END, ',') AS Tel,
STRING_AGG(CASE WHEN CHARINDEX('@', Entry) > 0 THEN Entry END, ',') AS Email
FROM TableA a
CROSS APPLY STRING_SPLIT(a.ParLab, ';') s
LEFT JOIN TableB b ON s.[value] = b.Lab
WHERE b.Customer IS NOT NULL
GROUP BY b.Customer, b.Lab
Результаты:
Customer Lab Tel Email
Lynn 58 948487,563467 e@y.com
Laurence 80 938745 d@g.com,d@m.com
Emmanuel 88 827120 k@g.com
Примечания:
Функция STRING_SPLIT()
доступна в SQL Server 2016, STRING_AGG()
доступна в SQL Server 2017+.Функцию STRING_SPLIT()
следует использовать осторожно, поскольку порядок возвращаемых строк не обязательно соответствует порядку подстрок во входной строке.