【问题标题】:SQL: Select multiple rows for every filled columnSQL:为每个填充的列选择多行
【发布时间】:2018-07-18 11:21:32
【问题描述】:

我有一张桌子:

  • 人员 ID
  • 姓名
  • 电话1
  • 电话2
  • 传真1
  • 传真2

我有这样的记录:

SELECT * FROM Person

1   Test    0123                NULL    0123
2   Test2   NULL    567         789     NULL
3   Test3   0123    NULL        NULL    0123
4   Test4   0123    5555        NULL    

(结果有 NULL 但也有 EMPTY 字符串)

我想选择所有有效数字(每个可用数字多条记录):

1   Test    0123
1   Test    0123
2   Test    567 
2   Test    789

这可能吗?我选择每个可用值的所有列并将值存储在最后一列中?

【问题讨论】:

  • 我想第二列应该是这个人的真实姓名,而不仅仅是'Test'。我还假设您想要人 3 和 4。
  • 样本数据和你提供的结果好像有问题……

标签: sql sql-server database join


【解决方案1】:

一个简单的方法使用apply

select p.personid, p.name, v.contact_number
from person p cross apply
     (values (phone1), (phone2), (fax1), (fax2)) v(contact_number)
where v.contact_number is not null;

【讨论】:

    【解决方案2】:

    使用apply

    Select personId, name, v.value from Person
    cross apply (values(Phone1),
                       (Phone2),
                        (Fax1),
                        (Fax2))v(value)
    where ISNULL(LTRIM(RTRIM(v.value)),'')<>''
    

    【讨论】:

      【解决方案3】:

      这应该适用于 2012+。对于旧的将 iif 转换为大小写。

      SELECT * , 
        IIF(Phone1 IS NULL or Phone1 = '',0,Phone1)
      + IIF(Phone2 IS NULL or Phone2 = '',0,Phone2)
      + IIF(Fax1 IS NULL or Fax1 = '',0,Fax1)
      + IIF(Fax2 IS NULL or Fax2 = '',0,Fax2) newcolm
      FROM Person
      

      【讨论】:

        猜你喜欢
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多