56 Stimmen

ORDER BY FIELD() von MySQL in Postgresql simulieren

Ich probiere PostgreSQL gerade zum ersten Mal aus, da ich von MySQL komme. In unserer Rails-Anwendung haben wir ein paar Orte mit SQL wie so:

SELECT * FROM `currency_codes` ORDER BY FIELD(code, 'GBP', 'EUR', 'BBD', 'AUD', 'CAD', 'USD') DESC, name ASC

Es dauerte nicht lange, bis ich herausfand, dass dies in PostgreSQL nicht unterstützt/erlaubt ist.

Weiß jemand, wie man dieses Verhalten in PostgreSQL simulieren kann, oder müssen wir die Sortierung in den Code übernehmen?

1voto

Deepak Mahakale Punkte 20945

Erstellen Sie eine Migration mit dieser Funktion

CREATE OR REPLACE FUNCTION field(anyelement, VARIADIC anyarray) RETURNS bigint AS $$
  SELECT n FROM (
    SELECT row_number() OVER () AS n, x FROM unnest($2) x)
      numbered WHERE numbered.x = $1;
$$ LANGUAGE SQL IMMUTABLE STRICT;

Dann machen Sie einfach Folgendes

sequence = [2,4,1,5]
Model.order("field(id,#{sequence.join(',')})")

voila!

0voto

JacobEvelyn Punkte 3691

Als ich antwortete aquí habe ich gerade ein Schmuckstück veröffentlicht ( auftrag_wie_bestimmt ), mit der Sie native SQL-Bestellungen wie diese durchführen können:

CurrencyCode.order_as_specified(code: ['GBP', 'EUR', 'BBD', 'AUD', 'CAD', 'USD'])

Sie gibt eine ActiveRecord-Relation zurück und kann daher mit anderen Methoden verkettet werden, und sie funktioniert mit jedem RDBMS, das ich getestet habe.

0voto

plaes Punkte 30086

Es ist auch möglich, diese Bestellung mit Hilfe des Arrays unnest zusammen WITH ORDINALITY Funktionalität:

--- Table and data setup ...
CREATE TABLE currency_codes (
     code text null,
     name text
);
INSERT INTO currency_codes
  (code)
VALUES
  ('USD'), ('BBD'), ('GBP'), ('EUR'), ('AUD'), ('CAD'), ('AUD'), ('AUD');

-- ...and the Query
SELECT
  c.*
FROM
  currency_codes c
JOIN
  unnest('{"GBP", "EUR", "BBD", "AUD", "CAD", "USD"}'::text[])
  WITH ORDINALITY t(code, ord)
  USING (code)
ORDER BY t.ord DESC, c.name ASC;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X