【发布时间】:2020-11-24 04:17:43
【问题描述】:
我正在尝试确定如何在 SQL Server 查询中清理和填充一组地址行。 (需要兼容 SQL Server 2008 及更高版本)
我有 5 个地址行 Addr1 - Addr5,我想在查询中将它们输出到 4 个连续填充的列中。如果 N 个地址不为空,则应填充最终地址 FAddr1 到 FAddrN。 (任何剩余的列都应该为空。如果所有 5 个地址行都已填充,则最后一个被删除。)
请注意,稍后我可能会添加第 6 个 Addr 列,但这并不需要对任何 N 列进行通用解决。 (6 Addr 列应该是最大值。)数据无法事先标准化,所以我必须以最快的方式即时执行此操作。
复杂性在于如何将地址行列“向左”移动以覆盖空白列。
这是一个例子:
Addr1 Addr2 Addr3 Addr4 Addr5
--------------------------------------------------------------------------------
101 Main St Apt 1 Here, AZ 11111 USA
102 Main St Here, AZ 22222
103 Main St Apt 3 Here, AZ 33333 USA
104 Main St Here, AZ 44444 USA
对于这些示例,我想输出:
FAddr1 FAddr2 FAddr3 FAddr4
----------------------------------------------------------------
101 Main St Apt 1 Here, AZ 11111
102 Main St Here, AZ 22222
103 Main St Apt 3 Here, AZ 33333 USA
104 Main St Here, AZ 44444 USA
我是用 C# 编写的,但复杂性在于以一种简洁的方式在 SQL 中执行此操作。通过连接成一个字符串来实现这一点要容易得多(请参阅下面的相关问题)。但我需要将这些放在 4 个单独的列中。
相关问题: Most Similar Question - Different Use Case/Similar But With String Instead of Columns
初始版本:
我在 SQL 中使用了一个似乎可以正常工作的测试用例编写了以下版本,但我希望有一种更简洁的方法。这基本上会不断移动非空元素。但是每列需要一个子选择才能将所有内容向左移动。
Select
Addr1,
case when Addr2 is null then Addr3 else Addr2 end as Addr2,
case when Addr2 is null then null else Addr3 end as Addr3,
case when Addr4 is null then Addr5 else Addr4 end as Addr4
-- Truncate to 4 - case when Addr4 is null then null else Addr5 end as Addr5
From
(
Select
case when Addr1 is null then Addr2 else Addr1 end as Addr1,
case when Addr1 is null then null else Addr2 end as Addr2,
case when Addr3 is null then Addr4 else Addr3 end as Addr3,
case when Addr3 is null then null else Addr4 end as Addr4,
Addr5
From
(
Select
Addr1,
case when Addr2 is null then Addr3 else Addr2 end as Addr2,
case when Addr2 is null then null else Addr3 end as Addr3,
case when Addr4 is null then Addr5 else Addr4 end as Addr4,
case when Addr4 is null then null else Addr5 end as Addr5
From
(
Select
case when Addr1 is null then Addr2 else Addr1 end as Addr1,
case when Addr1 is null then null else Addr2 end as Addr2,
case when Addr3 is null then Addr4 else Addr3 end as Addr3,
case when Addr3 is null then null else Addr4 end as Addr4,
Addr5
From
(
Select
Addr1,
case when Addr2 is null then Addr3 else Addr2 end as Addr2,
case when Addr2 is null then null else Addr3 end as Addr3,
case when Addr4 is null then Addr5 else Addr4 end as Addr4,
case when Addr4 is null then null else Addr5 end as Addr5
From
(
SELECT NULL as Addr1, NULL as Addr2, NULL as Addr3, NULL as Addr4, NULL as Addr5 UNION
SELECT NULL, NULL, NULL, NULL, '5' UNION
SELECT NULL, NULL, NULL, '4', NULL UNION
SELECT NULL, NULL, NULL, '4', '5' UNION
SELECT NULL, NULL, '3', NULL, NULL UNION
SELECT NULL, NULL, '3', NULL, '5' UNION
SELECT NULL, NULL, '3', '4', NULL UNION
SELECT NULL, NULL, '3', '4', '5' UNION
SELECT NULL, '2', NULL, NULL, NULL UNION
SELECT NULL, '2', NULL, NULL, '5' UNION
SELECT NULL, '2', NULL, '4', NULL UNION
SELECT NULL, '2', NULL, '4', '5' UNION
SELECT NULL, '2', '3', NULL, NULL UNION
SELECT NULL, '2', '3', NULL, '5' UNION
SELECT NULL, '2', '3', '4', NULL UNION
SELECT NULL, '2', '3', '4', '5' UNION
SELECT '1', NULL, NULL, NULL, NULL UNION
SELECT '1', NULL, NULL, NULL, '5' UNION
SELECT '1', NULL, NULL, '4', NULL UNION
SELECT '1', NULL, NULL, '4', '5' UNION
SELECT '1', NULL, '3', NULL, NULL UNION
SELECT '1', NULL, '3', NULL, '5' UNION
SELECT '1', NULL, '3', '4', NULL UNION
SELECT '1', NULL, '3', '4', '5' UNION
SELECT '1', '2', NULL, NULL, NULL UNION
SELECT '1', '2', NULL, NULL, '5' UNION
SELECT '1', '2', NULL, '4', NULL UNION
SELECT '1', '2', NULL, '4', '5' UNION
SELECT '1', '2', '3', NULL, NULL UNION
SELECT '1', '2', '3', NULL, '5' UNION
SELECT '1', '2', '3', '4', NULL UNION
SELECT '1', '2', '3', '4', '5'
) as Base
) as Pass1 ) as Pass2 ) as Pass3 ) as Pass4
【问题讨论】:
标签: sql sql-server street-address