SQL:如何更新多个字段,以便将空字段内容移动到逻辑上的最后一列 - 丢失空白地址行

Lev*_*der 3 sql t-sql sql-server sql-server-2008

我有三个地址线列,aline1,aline2,aline3作为街道地址.从不一致的数据开始,任何或所有数据都可以是空白的.我想将第一个非空白移动到addrline1,将第二个非空白移动到addrline2,如果没有三个非空​​白行,则清除第3行,否则将其保留.("First"表示aline1是第一个,除非它是空白的,aline2是第一个,如果aline1是空白,aline3是第一个,如果aline1和2都是空白)

此临时表中的行没有密钥,可能存在重复的行.我可以添加一把钥匙.

不计算枚举空白和非空白的可能组合并移动字段的大案例陈述,如何更新表格?(同样的问题出现了超过3行,所以这就是为什么我不想使用case语句)

我正在使用Microsoft SQL Server 2008

Mar*_*ith 5

另一种选择.它使用未记录的%%physloc%%函数在没有密钥的情况下工作.在表格中添加密钥会更好.

CREATE TABLE #t
(
aline1 VARCHAR(100), 
aline2 VARCHAR(100), 
aline3  VARCHAR(100)
)

INSERT INTO #t VALUES(NULL, NULL, 'a1')
INSERT INTO #t VALUES('a2', NULL, 'b2')

;WITH cte
     AS (SELECT *,
                 MAX(CASE WHEN RN=1 THEN value END) OVER (PARTITION BY %%physloc%%) AS new_aline1,
                 MAX(CASE WHEN RN=2 THEN value END) OVER (PARTITION BY %%physloc%%) AS new_aline2,
                 MAX(CASE WHEN RN=3 THEN value END) OVER (PARTITION BY %%physloc%%) AS new_aline3
         FROM   #t
                OUTER APPLY (SELECT ROW_NUMBER() OVER (ORDER BY CASE WHEN value IS NULL THEN 1 ELSE 0 END, idx) AS
                                   RN, idx, value
                             FROM   (VALUES(1,aline1),
                                           (2,aline2),
                                           (3,aline3)) t (idx, value)) d)
UPDATE cte
SET    aline1 = new_aline1,
       aline2 = new_aline2,
       aline3 = new_aline3  


SELECT *
FROM #t

DROP TABLE #t
Run Code Online (Sandbox Code Playgroud)