it-swarm.com.de

Benutzerdefinierte Reihenfolge in Oracle SQL

Ich muss die Transaktion basierend auf der Währung bestellen ..__ Allerdings muss ich eine benutzerdefinierte Bestellung implementieren, die dazu führt, dass der USD immer an der Spitze steht und der Rest aufsteigend bestellt werden sollte.

zum Beispiel :

  • BHT 
  • USD 
  • MYR 
  • JYP

sollte sortiert werden wie:

  • USD
  • BHT
  • JPY
  • MYR

Gibt es eine einfache Möglichkeit, damit umzugehen?

50
Rudy

Ich weiß nicht, ob dies als einfach gilt:

order by 
    case 
       when currency = 'USD' then 1 
       when currency = 'BHT' then 2
       when currency = 'JPY' then 3
       when currency = 'MYR' then 4
       else 5
    end

oder etwas kompakter, aber Oracle-spezifisch:

order by decode(currency, 'USD', 1, 'BHT', 2, 'JPY', 3, 'MYR', 4, 5)

Bei der obigen Lösung, bei der Nummern zur Definition der Sortierreihenfolge verwendet werden, werden Währungen nicht automatisch korrekt sortiert, die im case/decode-Ausdruck nicht erwähnt werden.

Um den USD einfach in den Vordergrund zu stellen und sich nicht um den Rest zu kümmern, müssen die "generierten" Ordnungskriterien ebenfalls ein Zeichenwert sein. In diesem Fall können Sie Folgendes verwenden:

order by 
    case 
       when currency = 'USD' then '001' 
       else currency
    end

Welches eine "alphabetische" Reihenfolge verwendet. Dies funktioniert, weil Zeichen nach den Ziffernstellen sortiert werden. (Die Verwendung von 'AAA' anstelle von '001' würde ebenfalls funktionieren).

93

Um sicherzustellen, dass Ihre Sortierung "flexibel" ist und mit allen Währungen funktioniert, führen Sie folgende Schritte aus:

SELECT <columns>
FROM <tableName>
ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn
18
Grzegorz W

Eine detailliertere Methode, wenn Sie bestimmte Werte am Anfang oder am Ende sortieren möchten, die Werte jedoch in ihrer Gruppe sortiert sind:

order by
  case when currency in ('USD', 'CAD') 
    then '000'||currency
  when currency in ('ZWD', 'HTG')
    then 'ZZZ'||currency
  else currency 
  end

Dadurch werden USD und CAD ganz oben in der Liste (sortiert), ZWD und HTG unten angezeigt, und der Rest wird zwischen diesen sortiert. 

6
David Oneill

Vielleicht hilft dir das:

order by decode(currency, 'USD', 1, 2)

oder case verwenden

  order by 
      case 
        when currency = 'USD' then 1 
        else 2
      end
0
Parado

Ich musste dasselbe tun, aber mit mehreren Spalten, und fand die Antwort von Grzegorz W am besten, mit der folgenden einfachen Ergänzung:

SELECT <columns>
FROM <tableName>
ORDER BY DECODE(currencyColumn,'USD', 1, 2), currencyColumn, anotherColumn;
0
SurfingSanta

Eine weitere Variante mit regulären Ausdrücken wie die Funktion FIELD() in MySQL:

select
meas_code,
to_number(regexp_replace(meas_code, replace('(meas1,meas2,meas3)', ',', '|'), instr(replace('(meas1,meas2,meas3)', ',', '|'), meas_code))) ordr
from (select cast(column_value as varchar2(10)) as meas_code from xmltable('''meas1'',''meas2'',''meas3'''))
order by 2
0
mishok