SQL 将两个地址列转换为一个

SQL converting two address column into one

我有一个table

结果我期望只有两列名称和地址,对于 add1 和 aad2,如果它们相似,我只想在地址中显示一次,对于不同的 aad1 和 add2,我想在两个不同的行中显示它们两次 我期待这个输出

可移植方法使用 union all 将列反透视为行并消除重复项:

select name, add1 as add from mytable
union all select name, add2 from mytable where add2 <> add1

根据您的数据库,可能有更好的选择。典型的解决方案是横向连接 - 但语法高度依赖于数据库(并非所有数据库都实现该功能)。


编辑:在SQL 服务器:

select t.name, a.add
from mytable t
cross apply (values (add1), (case when add1 <> add2 then add2 end)) a(add)
where a.add is not null

在 oracle 数据库和 sql-server 中,联合运算符删除重复行

select name, add1 as address from mytable
union
select name, add2 from mytable

我喜欢使用 cross apply 逆轴旋转。在您的情况下,您可以使用这样的逻辑:

select t.name, v.add
from t cross apply
     (values (1, add1), (2, add2)) v(n, add)
where n = 1 or (n = 2 and t.add1 <> t.add2);

也就是永远取第一个地址。与第一个不同的取第二个