【问题标题】:SQL: Match a variable value with multiple columns and select matching column nameSQL:将变量值与多列匹配并选择匹配的列名
【发布时间】:2022-01-15 06:44:58
【问题描述】:

我想获取匹配电话号码的记录。共有 3 列保存电话号码。工作、家庭和手机。 我正在编写一个查询来检查电话号码是否与 3 列中的任何一个匹配。

declare @phNo nvarchar(15) = 'xxxxxxxxxx'

select HomePhone, cellphone, workphone, * 
from Contact_Table 
where @phNo in (HomePhone, cellphone, workphone)

此查询运行良好,但我还想要与电话号码匹配的列名。如何获取匹配列的名称?

例如,如果电话号码与“homehpone”匹配,则结果集应返回“homephone”

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    使用APPLY 运算符也是一种选择:

    DECLARE @phNo nvarchar(15) = 'xxxxxxxxxx'
    
    SELECT HomePhone, CellPhone, WorkPhone, a.PhoneType 
    FROM (VALUES
       ('xxxxxxxxxx', '000-000-000', '000-000-000'),
       ('000-000-000', '000-000-000', '000-000-000'),
       ('000-000-000', 'xxxxxxxxxx', '000-000-000')
    ) t (HomePhone, CellPhone, WorkPhone)
    OUTER APPLY (VALUES
       (t.HomePhone, 'HomePhone'), 
       (t.CellPhone, 'CellPhone'),
       (t.WorkPhone, 'WorkPhone')
    ) a (Phone, PhoneType) 
    WHERE @phNo = a.Phone
    

    结果:

    HomePhone CellPhone WorkPhone PhoneType
    xxxxxxxxxx 000-000-000 000-000-000 HomePhone
    000-000-000 xxxxxxxxxx 000-000-000 CellPhone

    【讨论】:

      【解决方案2】:

      这可以通过 CASE 来完成:

      DECLARE @phNo NVARCHAR(15) = 'xxxxxxxxxx';
      
      SELECT homephone,cellphone,workphone, *,
             CASE WHEN @phNo = homephone THEN 'homephone'
                  WHEN @phNo = cellphone then 'cellphone'
                  WHEN @phNo = workphone THEN 'workphone'
                  END AS PhoneMatch
      FROM Contact_Table
      WHERE @phNo IN (HomePhone,cellphone,workphone);
      

      【讨论】:

      • 谢谢@squillman!但是会影响性能吗?
      • @user1181942 当然,因为这是数据库引擎必须做的额外工作。它将对性能产生多大影响取决于与您的服务器实例和架构/索引设计相关的很多事情。不过,我不认为它会引起注意。
      猜你喜欢
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 2022-07-06
      • 2012-12-22
      相关资源
      最近更新 更多