aktualisieren, grandios Vorschlag von @Tometzky konkretisieren.
Dies sollte Ihnen eine MySQL FIELD()
-alike Funktion unter pg geben 8,4:
-- SELECT FIELD(varnames, 'foo', 'bar', 'baz')
CREATE FUNCTION field(anyelement, VARIADIC anyarray) RETURNS numeric AS $$
SELECT
COALESCE(
(SELECT i FROM generate_subscripts($2, 1) gs(i)
WHERE $2[i] = $1),
0);
$$ LANGUAGE SQL STABLE
Mea culpa, aber ich kann die oben auf 8.4 jetzt nicht überprüfen; jedoch kann ich arbeite nach hinten zu einer „moralisch“ gleichwertigen Version, die auf der 8.1-Instanz vor mir funktioniert:
-- SELECT FIELD(varname, ARRAY['foo', 'bar', 'baz'])
CREATE OR REPLACE FUNCTION field(anyelement, anyarray) RETURNS numeric AS $$
SELECT
COALESCE((SELECT i
FROM generate_series(1, array_upper($2, 1)) gs(i)
WHERE $2[i] = $1),
0);
$$ LANGUAGE SQL STABLE
Mehr ungeschickt, noch kann man portably eine (möglicherweise abgeleitet) Tabelle des Währungscode Rankings verwenden, so wie:
pg=> select cc.* from currency_codes cc
left join
(select 'GBP' as code, 0 as rank union all
select 'EUR', 1 union all
select 'BBD', 2 union all
select 'AUD', 3 union all
select 'CAD', 4 union all
select 'USD', 5) cc_weights
on cc.code = cc_weights.code
order by rank desc, name asc;
code | name
------+---------------------------
USD | USA bits
CAD | Canadian maple tokens
AUD | Australian diwallarangoos
BBD | Barbadian tridents
EUR | Euro chits
GBP | British haypennies
(6 rows)
Es könnte nützlich sein zu erklären, was Sie erreichen möchten. So schwer vorzustellen, wie es ist - nicht jeder kennt MySQL :) –
Toller Punkt depesz! Grundsätzlich ist eine benutzerdefinierte Sortierreihenfolge das, wonach wir suchen. Mit der FIELD-Funktion können Sie benutzerdefinierte Sets erstellen, mit denen Sie sortieren können. –