Oracle CASE в предложении WHERE - PullRequest
1 голос
/ 06 февраля 2012

Может ли кто-нибудь помочь мне с приведенным ниже запросом в Oracle?
Логика заключается в том, что если у человека есть понятное имя, используйте его для соответствия критерию поиска. В противном случае попробуйте сопоставить столбец с реальным именем.

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 ]

2 голосов
/ 06 февраля 2012

В Oracle булевы выражения нельзя трактовать как другие типы выражений;например, CASE выражения не могут быть оценены для них.Поэтому вам нужно переписать это.

В этом случае, поскольку у вас есть одинаковый предикат LIKE '%abcd%' в обеих ветвях, вы могли бы просто выделить его:1009 * но проще использовать встроенную NVL функцию и написать:

WHERE NVL(customer_friendlyname, realname) LIKE '%abcd%'
2 голосов
/ 06 февраля 2012
SELECT *
FROM people
WHERE (customer_friendlyname LIKE '%abc%')
   OR (customer_friendlyname is null and realname LIKE '%abc%')

Здесь вам на самом деле не нужен регистр, оператор this или сначала будет использовать понятное имя, если оно было пустым, оно не будет совпадать, а затем попытается найти совпадение, используя настоящее имя

1 голос
/ 12 июля 2013

Вы также можете написать это так:

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

Но это удобнее в случае, когда у вас больше выражений.

...