我在不使用IsNull运算符的情况下重写了以下查询,因为我在这些列上使用加密并且不支持IsNull。
Case When Indicator = 'N' Then Null
Else IsNull(c.email1, IsNull(E.email, ORG_Email)) End EmailAddress
答案 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.email1
和E.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
当然,假设存在一个空的等效字符串,至少在每个列的基础上,可能不是这种情况。如果不是那么我看到的唯一选择是
解密查询中的电子邮件值(可能通过用户定义的函数)并根据解密的值写入条件,或
将加密的c.email1
和E.email
作为单独的列返回,如果Indicator
为'N'
,则返回null,并选择要使用哪一个申请方,解密后。