PostgreSQL ORDER BY значения в предложении IN () - PullRequest
5 голосов
/ 26 июля 2011

Хорошо, есть несколько ответов о том, как это сделать.Но все ответы предполагают, что запрос выбирает все.Если у вас есть отдельный выбор, методы больше не работают.

См. Здесь для этого метода: Имитация MySQL ORDER BY FIELD () в Postgresql

В основном у меня есть

SELECT DISTINCT id 
FROM items 
WHERE id IN (5,2,9) 
ORDER BY
 CASE id
  WHEN 5 THEN 1 
  WHEN 2 THEN 2
  WHEN 9 THEN 3
 END

Конечно, это прерывает и говорит

"PGError: ERROR: для SELECT DISTINCT, выражения ORDER BY должны появляться в списке выбора"

Есть ли способ упорядочить результаты вашего запроса в PostgreSQL по порядку значений в предложении IN?

Ответы [ 4 ]

7 голосов
/ 26 июля 2011

Вы можете поместить его в производную таблицу:

SELECT *
FROM (
  SELECT DISTINCT id 
  FROM items 
  WHERE id IN (5,2,9) 
) t
ORDER BY
 CASE id
  WHEN 5 THEN 1 
  WHEN 2 THEN 2
  WHEN 9 THEN 3
 END
1 голос
/ 10 декабря 2015

Оглядываясь вокруг, я не смог найти полное решение этого вопроса.

Я думаю, что лучшее решение - использовать этот запрос

SELECT *
FROM items
WHERE id IN (5,2,9) 
ORDER BY idx(array[5,2,9]::integer[], items.id)

Если вы используете PostgreSQL> = 9.2, вы можете включить функцию idx, включающую расширение.

CREATE EXTENSION intarray;

В противном случае вы можете создать его следующим образом:

CREATE OR REPLACE FUNCTION idx(anyarray, anyelement)
  RETURNS INT AS 
$$
  SELECT i FROM (
     SELECT generate_series(array_lower($1,1),array_upper($1,1))
  ) g(i)
  WHERE $1[i] = $2
  LIMIT 1;
$$ LANGUAGE SQL IMMUTABLE;

Я действительно предлагаю использовать ::integer[] в запросе, потому что, если вы создаете массив динамически, возможно, что в нем нет элементов, что приведет к ids(array[], items.id), что вызовет исключение в PostgreSQL.

1 голос
/ 26 июля 2011

Из документации :

Совет: Группировка без агрегатных выражений эффективно вычисляет набор различных значений в столбце. Это также может быть достигнуто с помощью предложение DISTINCT (см. Раздел 7.3.3 ).

SQL-запрос:

SELECT id 
FROM items 
WHERE id IN (5,2,9) 
GROUP BY id
ORDER BY
    CASE id
        WHEN 5 THEN 1 
        WHEN 2 THEN 2
        WHEN 9 THEN 3
    END;
0 голосов
/ 08 августа 2014

Я создаю эту функцию в postgres PL / PGSQL, и ее намного проще использовать.

-- Function: uniqueseperategeomarray(geometry[], double precision)

-- DROP FUNCTION uniqueseperategeomarray(geometry[], double precision);

CREATE OR REPLACE FUNCTION manualidsort(input_id int, sort_array int[])
  RETURNS int AS
$BODY$
DECLARE
input_index int;
each_item int;
index int;
BEGIN
index := 1;
  FOREACH each_item IN ARRAY sort_array
  LOOP
    IF each_item = input_id THEN
      RETURN index;
    END IF;
    index := index+1;
  END LOOP;
END;
$BODY$
  LANGUAGE plpgsql;
ALTER FUNCTION manualidsort(int, int[])
  OWNER TO staff;

И когда вы запускаете запрос, идите так ...

SELECT * FROM my_table ORDER BY manualidsort(my_table_id, ARRAY[25, 66, 54])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...