Frage

Ich habe durch eine Spalte meiner Daten sortieren, so dass einiger spezifischer Wert wird zuerst angezeigt. Also für eine Abfrage wie folgt ...

  SELECT rtrim(taskid) into v_taskid FROM tasks
  where
    /* some where clausers */
  and rownum = 1

... Ich habe es auf case when basiert, aber was mich stört, ist drei verschachtelte wählt Ich habe jetzt:

  SELECT rtrim(taskid) into v_taskid FROM tasks where taskid in (
    select taskid from (
        select taskid,
        case when taskuser like '%myuser%' 
       then 0
           else 100
        end as ordervalue
        FROM tasks
        where       
          /* some where clausers */
        order by ordervalue
        )
    )    
    and rownum = 1

Performance-weise ich denke, es ist kein Problem sein sollte, aber es sieht ein bisschen eine Spaghetti ... Gibt es eine Möglichkeit case-when in die where Klausel zu setzen?

War es hilfreich?

Lösung

Sie sind die Abfrage der tasks Tabelle zweimal. Dies ist nicht erforderlich und wird Ihre Abfrage ausführen langsam machen. Ihre Abfrage kann in eine einfache Abfrage wie so kombiniert werden:

SELECT rtrim(taskid) into v_taskid
FROM (
  SELECT taskid 
  FROM tasks 
  WHERE /* some where clauses */
  ORDER BY case when taskuser like '%myuser%' then 0 else 100 end
)
WHERE rownum = 1;

Dann entweder abrufen nur die erste Zeile oder den rownum Teil in einer äußeren Abfrage hinzuzufügen.

Andere Tipps

Benutzer row_number() over (...)

select 
  taskid
from (
  select 
    taskid,
    row_number() over (
      order by 
        case when taskuser like '%myuser%' then  0 
                                           else 100 
      end
    ) r
  from
    tasks
  WHERE
    /* some where clausers */
)
where 
  r = 1;

Wenn taskid der Primärschlüssel tasks ist, dass Sie nicht brauchen, die Self-Join (äußere SELECT):

SELECT rtrim(taskid)
  FROM (SELECT taskid
           FROM tasks
           /* where clause */
          ORDER BY CASE
                      WHEN taskuser LIKE '%myuser%' THEN
                       0
                      ELSE
                       100
                   END)
 WHERE ROWNUM = 1
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top