2017-06-16 4 views
-1

Ich versuche, eine SQL-Abfrage zu schreiben, die "OR" Operator hat. Die Sache ist, dass ich möchte, dass es mit einigen funktioniert, sagen wir "Prioritäten". Ich habe eine Entität Artikel, es hat zwei Felder, die ich auf der Suche verwenden:Sortierung in SQL bei Verwendung logischer Operatoren

  • Beschreibung
  • Titel

Und es gibt eine SQL-Abfrage:

select * from item 
where description like '%a%' or title like '%a%'; 

Was ich hier möchte, ist, dass wenn wir zwei Entitäten ret haben urned und einer von ihnen passt wie '% a%' nach Beschreibung und ein anderer - nach Titel sollte derjenige, der über Titel übereinstimmt, der erste in der Liste sein. Mit anderen Worten, es sollte eine größere Priorität haben. Gibt es eine Möglichkeit, einen solchen Zweck in SQL zu beschreiben?

Dialect: Oracle/H2

Antwort

4

In Oracle können Sie eine CASE verwenden kann um Werte, um zu bestellen, die durch die Art und Weise geordneten Reihen macht sie entsprechen Ihrer Bedingungen:

/* test case */ 
with item(title, description) as (
    select '__x__', '__x__' from dual union all 
    select '__x__', '__a__' from dual union all 
    select '__a__', '__x__' from dual union all 
    select '__a__', '__a__' from dual 
    ) 
/* the query */ 
select * 
from item 
where description like '%a%' or title like '%a%' 
order by case 
      when title like '%a%' 
      then 1 
      else 2 
     end 

Diese gibt:

TITLE DESCR 
----- ----- 
__a__ __x__ 
__a__ __a__ 
__x__ __a__ 
+0

Vielen Dank! Das funktioniert perfekt in meinem Fall! Ich benutze jpa2 Kriterien. Ausdruck orderByExp = criteriaBuilder.selectCase() .wenn (Prädikat, 1) .anderen (2); query.orderBy (KriterienBuilder.asc (orderByExp)); – dvelopp

Verwandte Themen