如何使用case而不是IsNull

时间:2016-08-02 21:35:46

标签: sql sql-server

我在不使用IsNull运算符的情况下重写了以下查询,因为我在这些列上使用加密并且不支持IsNull。

Case When Indicator = 'N' Then Null 
Else IsNull(c.email1, IsNull(E.email, ORG_Email)) End EmailAddress

3 个答案:

答案 0 :(得分:2)

为此我建议coalesce()

(Case When Indicator = 'N' Then Null
      Else coalesce(c.email1, E.email, ORG_Email)
 End) as EmailAddress

但我会在没有else的情况下说出这句话。假设Indicator永远不会NULL

(case when Indicator <> 'N' 
      then coalesce(c.email1, E.email, ORG_Email)
 end) as EmailAddress

答案 1 :(得分:1)

以下是使用case语句执行此操作的方法:

Case 
    when Indicator = 'N' then Null 
    when c.email1 is not null then c.email1 
    when e.email is not null then e.email 
    else ORG_Email
end EmailAddress

然而,正如其他人所指出的那样,另一个选择是使用coalesce,如果它能够满足您的需求。不确定为什么isnull不受支持。

答案 2 :(得分:0)

  

我在不使用IsNull运算符的情况下重写了以下查询,因为我在这些列上使用加密并且不支持IsNull

我认为你的意思是列c.email1E.email永远不会为空,但它们有时包含加密字符串,这些字符串以类似于通常由NULL传达的方式传达数据的缺失。例如,可能使用加密形式的空字符串。在那种情况下,您可以将它们的值与加密的等效空值进行比较:

Case
  When Indicator = 'N' Then Null 
  when c.email1 != 'some-encrypted-string-equivalent-to-null' then c.email1
  when E.email != 'some-encrypted-string-equivalent-to-null' then E.email
  else ORG_Email
End EmailAddress

当然,假设存在一个空的等效字符串,至少在每个列的基础上,可能不是这种情况。如果不是那么我看到的唯一选择是

  1. 解密查询中的电子邮件值(可能通过用户定义的函数)并根据解密的值写入条件,或

  2. 将加密的c.email1E.email作为单独的列返回,如果Indicator'N',则返回null,并选择要使用哪一个申请方,解密后。

相关问题