一尘不染

创建新的基于行数据的列值 SQL

sql

我正在尝试使用现有数据创建新数据,但在列中使用分隔值。我在 sql server 2014 vesrion 上运行它。这是我的桌子

create table #test ( ID INT , 
 CODE VARCHAR(10) ,M_U VARCHAR(5) , M_C VARCHAR(5) ,SEPERATOR_A VARCHAR(5)
,CODE1 VARCHAR(10),  M1_U VARCHAR(5) , M1_C VARCHAR(5)  ,SEPERATOR_B VARCHAR(5)
,CODE2 VARCHAR(10),  M2_U VARCHAR(5) , M2_C VARCHAR(5) ) 

INSERT INTO #TEST 
VALUES (  123 , '1' ,'ABC' , 'XYZ', NULL, NULL , NULL ,NULL ,NULL, NULL ,NULL,NULL)
,(  456 , 'G4762' ,'D01' , '398', '^', 'G4765', 'E043' ,NULL ,NULL, NULL ,NULL,NULL)
,(  893 , 'H7832' ,'U73' , 'R12', '^', 'H9833', NULL ,'F82' ,'^', 'H563' ,'U83',NULL)

这是我期望的结果

在此处输入图像描述

任何帮助将不胜感激!!


阅读 70

收藏
2022-07-21

共1个答案

一尘不染

正如@nbk 建议的那样,您不需要扫描表三次。

相反,您可以CROSS APPLY在引用表的外部引用时合并各个列。

SELECT 
  t.ID,
  v.*
FROM #test t
CROSS APPLY (
    SELECT t.CODE, t.M_U, t.M_C, 1
    WHERE t.CODE IS NOT NULL
    UNION ALL
    SELECT t.CODE1, t.M1_U, t.M1_C, 2
    WHERE t.CODE1 IS NOT NULL
    UNION ALL
    SELECT t.CODE2, t.M2_U, t.M2_C, 3
    WHERE t.CODE2 IS NOT NULL
) v(CODE, M_U, M_C, Line)
ORDER BY
  t.ID,
  v.Line;

db<>fiddle,请注意我的版本只有一个表扫描。

2022-07-21