WHERE子句中的Oracle CASE

时间:2012-02-06 02:57:23

标签: oracle toad

有人可以帮我解决oracle中的以下查询吗? 逻辑是,如果该人具有友好名称,则使用该名称与“搜索”标准匹配。否则,尝试与realname列匹配。

select * from people where   
case when customer_friendlyname is null then realname like '%abcd%'  
else   
case when customer_friendlyname is not null then customer_friendlyname like '%abcd%'  
end   
end  

感谢有人可以看看..谢谢!

3 个答案:

答案 0 :(得分:2)

SELECT *
FROM people
WHERE (customer_friendlyname LIKE '%abc%')
   OR (customer_friendlyname is null and realname LIKE '%abc%')

你实际上不需要这里的情况,这个或者子句会首先尝试友好名称它是否为null它将不匹配,然后它将尝试使用真实姓名进行匹配

答案 1 :(得分:2)

在Oracle中,布尔表达式不能像其他类型的表达式那样对待;例如,CASE表达式无法对它们进行求值。所以你需要重写这个。

在这种情况下,由于您在两个分支中都有相同的LIKE '%abcd%'谓词,因此 可以将其排除在外:

WHERE ( CASE WHEN customer_friendlyname IS NULL
             THEN realname
             ELSE customer_friendlyname
         END
      ) LIKE '%abcd%'

但是使用the built-in NVL function更简单,并写:

WHERE NVL(customer_friendlyname, realname) LIKE '%abcd%'

答案 2 :(得分:1)

您也可以这样写:

select * from people where   
case
  when customer_friendlyname is null and realname like '%abcd%'
    then 1
  when customer_friendlyname is not null and customer_friendlyname like '%abcd%'
    then 1
    else 0
end = 1

但是当你有更多的表达时,它会更方便。