有人可以帮我解决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
感谢有人可以看看..谢谢!
答案 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
但是当你有更多的表达时,它会更方便。