从20多列sql中选择3个非空值

nr7wwzry  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(265)

我有一个表包含生物信息和20+列不同类型的电话号码都有不同的列名(相同的电子邮件和地址)我试图清理表中选择的前3个非空值从列为每一行。
现在我有

Id   FN     LN    Gender phone1    phone2   phone3   cellphone cell1 cell2    cell3  cell4  business1 etc
234  John  Smith  F     123-4566  Null     763-2899  243-8299  Null  289-2389  Null  Null   Null etc
394  Jane  Smith  F     Null      232-3553 345-2453  Null      Null  Null      Null  Null    453-5656 etc
556  Dash  Doe    M     121-3233  234-5466 234-2556  356-3564  232-6766 453-3453 676-2354  435-4543  etc

我要得到输出

Id   FN     LN    Gender phone1    phone2     phone3  
234  John  Smith  F     123-456    763-2899    243-8299  
394  Jane  Smith  F     232-3553   345-2453    453-5656
556  Dash  Doe    M     121-3233   234-5466     234-2556

我不知道这是否可行。

dwbf0jvd

dwbf0jvd1#

使用 cross apply 和条件聚合:

select t.*, p.*
from t cross apply
     (select max(case when seqnum = 1 then p.phone end) as phone1,
             max(case when seqnum = 2 then p.phone end) as phone2,
             max(case when seqnum = 3 then p.phone end) as phone3
      from (select v.phone, row_number() over (order by v.ord) as seqnum
            from (values (1, t.phone1), (2, t.phone2), (3, t.phone3),
                         (4, t.cellphone), . . .
                 ) v(ord, phone)
            where phone is not null
           ) p
     ) p

这是一把小提琴。

zpgglvta

zpgglvta2#

你可以一步一步地解决它,从

UPDATE t SET phone1 = phone2, phone2 = null
WHERE phone1 is null and phone2 is not null

相关问题