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 :
devrait être trié comme:
Y at-il un moyen simple de gérer cela?
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).
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
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.
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
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;
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