web-dev-qa-db-fra.com

Commande personnalisée dans Oracle SQL

Je dois commander une transaction basée sur la devise . Cependant, je dois implémenter une commande personnalisée en faisant en sorte que l'USD vienne toujours en tête, et le reste devrait être commandé asc.

par exemple :

  • BHT 
  • USD 
  • MYR 
  • JYP

devrait être trié comme:

  • USD
  • BHT
  • JPY
  • MYR

Y at-il un moyen simple de gérer cela?

50
Rudy

Je ne sais pas si cela peut être qualifié de simple:

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

ou un peu plus compact mais spécifique à Oracle:

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

La solution ci-dessus utilisant des nombres pour définir l'ordre de tri ne triera pas automatiquement correctement les devises qui ne sont pas mentionnées dans l'expression case/decode.

Pour placer simplement l'USD à l'avant sans se soucier du reste, les critères de commande "générés" doivent également être une valeur de caractère. Vous pouvez utiliser les éléments suivants dans ce cas:

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

Qui utilise un ordre "alphabétique". Cela fonctionne parce que les caractères sont triés après le nombre de chiffres. (Utiliser 'AAA' au lieu de '001' fonctionnerait aussi).

93

Pour vous assurer que votre type est "flexible" et fonctionnera avec toutes les devises, procédez comme suit:

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

Une façon plus détaillée de le faire, si vous souhaitez trier certaines valeurs au début ou à la fin, mais que celles-ci soient triées dans leur groupe:

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

Cela placera l'USD et CAD en haut de la liste (triés), ZWD et HTG en bas et le reste trié entre ceux-ci. 

6
David Oneill

Peut-être que cela vous aidera:

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

ou en utilisant case

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

J'avais besoin de faire la même chose, mais avec plusieurs colonnes, et j'ai trouvé que la réponse de Grzegorz W était la meilleure, avec le simple ajout suivant:

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

Une autre variante avec regexp comme la fonction FIELD() dans 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