代码之家  ›  专栏  ›  技术社区  ›  Dominic Rodger

Transact-SQL选择列列表中的条件

  •  1
  • Dominic Rodger  · 技术社区  · 15 年前

    我有一个查询看起来有点像这样:

    select
    records.id,
    contacts.name + ' (' + contacts.organization + ')' as contact,
    from records
    left join contacts on records.contact = contacts.contactid
    

    问题是 contacts.organization 经常是空的,我有“约翰·史密斯()”这样的联系人。如果组织不是空的,有没有方法只连接它?

    5 回复  |  直到 15 年前
        1
  •  2
  •   TheTXI    15 年前

    使用案例陈述

    SELECT
    records.id,
    CASE contacts.organization
        WHEN '' THEN contacts.name
        ELSE contacts.name + ' (' + contacts.organization + ')'
    END as Contact
    FROM records
    LEFT JOIN contacts ON records.contact = contacts.contactid
    

    您可以修改它来检查空值,但我不认为您有这个问题,因为如果您的contacts.organization中有空值,那么您的整个结果字段将为空而不是空白。

        2
  •  1
  •   Joel Goodwin    15 年前

    不确定这是否是最好的方法:

    CASE contacts.organization
    WHEN '' THEN ''
    ELSE '(' + contacts.organzation + ')' END
    
        3
  •  1
  •   BBlake    15 年前

    使用case,如contacts.organization不为空,则“(+c.o+”)“else”结束

        4
  •  0
  •   A-K    15 年前

    由于外部联接,您总是需要期望空值:

    select
    records.id,
    contacts.name + CASE WHEN contacts.organization IS NULL OR contacts.organization='' THEN '' ELSE ' (' + contacts.organization + ')' END as contact,
    from records
    left join contacts on records.contact = contacts.contactid
    
        5
  •  0
  •   SurroundedByFish    15 年前

    如果您处理的是空值,那么有一些函数专门用于它们,值得了解。

    零() 可能是你要找的那个。基本上需要两个参数。除非为空,否则返回第一个参数,否则返回第二个参数。

    以下是您的代码:

    select
    records.id,
    contacts.name + ISNULL(' (' + contacts.organization + ')', '') as contact,
    from records
    left join contacts on records.contact = contacts.contactid
    

    大多数与空相关的函数都可以用较大的case语句替换。箱子是你更常用的工具。但是使用特定的函数将使代码更干净,或者至少更简洁。