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
另一种选择.它使用未记录的%%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)
| 归档时间: |
|
| 查看次数: |
2698 次 |
| 最近记录: |