【问题标题】:Returning the original value if it doesn't match any of the when_expressions如果不匹配任何 when_expressions,则返回原始值
【发布时间】:2013-01-25 01:10:36
【问题描述】:

我的 SQL 导出字段上有一行,如果它与姓氏中的“AMA”完全匹配,我正在尝试删除字段中的返回空白值。但是,当我使用当前代码导出文件时,没有“AMA”作为姓氏的名称将完全空白。

,Max(
    Orders.ShipFirstName
    + ' ' +  
        CASE Orders.ShipLastName
            WHEN 'AMA' THEN ''
        END
) As ShipFullName

现在,如果某人是“Ray Miller”,ShipFullName 将返回为空白。但如果他们的名字是“Ray AMA”,那么他们的名字将返回为“Ray”。我想要它,以便在姓氏字段中找不到 AMA 时返回“Ray Miller”。

【问题讨论】:

    标签: sql sql-server tsql case-when


    【解决方案1】:

    为避免出现尾随空白,我会这样做:

    max(
        case 
            when Orders.ShipLastName = 'AMA' then Orders.ShipFirstName
            else Orders.ShipFirstName + ' ' + Orders.ShipLastName
        end
    ) as ShipFullName
    

    【讨论】:

    • 这是我最终使用的唯一一个。
    • @JackCole: imo,这种转换应该在表示层进行,而不是数据访问层。
    • 这是一个送货地址导出文件,大约一年来,我有一个批处理文件,托运人运行它来解决这个问题。但他们有时会忘记并运送名称中带有“AMA”的东西。至于为什么首先说“AMA”:制作从另一个数据库导入的文件的编码器无法弄清楚如何将全名解析为单独的字段,所以他只是将全名作为第一个名称,和姓“AMA”。他不让我碰他的代码,所以我必须以这种方式解决由此产生的问题。
    【解决方案2】:
    CASE Orders.ShipLastName
        WHEN 'AMA' THEN ''
        ELSE Orders.ShipLastName
    END
    

    【讨论】:

    • Danke,我已经尝试了一段时间的变体,但总是出错。你的工作完美。
    【解决方案3】:
    ,Max(
        Orders.ShipFirstName
        + ' ' +  IF(Orders.ShipLastName = 'AMA', '', Orders.ShipLastName)
    ) As ShipFullName
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 2012-12-19
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      相关资源
      最近更新 更多