@koliane

Как реализовать следующий запрос в postgresql?

Как реализовать следующий запрос работающий в mysql на postgresql?

SELECT `ID_1`, @last := `ID_2` AS `ID_2`
  FROM (
    SELECT `ID_1`, `ID_2` 
      FROM `table`
      ORDER BY `ID_1`, `ID_2`
  ) AS `t`, (SELECT @last:=0) as init
  WHERE `ID_1` > @last;

Как будут выглядеть подобные переменные в запросе postgresql?
  • Вопрос задан
  • 229 просмотров
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
PostgreSQL не может в одном запросе сочетать процедурный (использование пользовательских переменных) и декларативный стиль программирования. Для получения специфичной выборки вам нужно написать отдельную хранимую функцию:
CREATE OR REPLACE FUNCTION public.get_id1_id2() RETURNS SETOF test_table AS
$BODY$
DECLARE
 last integer := 0; -- аналог "SELECT @last:=0"
 r test_table%rowtype; -- курсор для выборки и анализа строки
BEGIN
  FOR r IN SELECT * FROM test_table -- проход по всей исходной выборки
  LOOP
    IF r."ID_1" > last THEN -- аналог "WHERE `ID_1` > @last;"
      last = r."ID_2"; -- аналог "@last := `ID_2`"
      RETURN NEXT r; -- включение текущей строки в выходную выборку
    END IF;
  END LOOP;
  RETURN;
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Либо реализовать постобработку полной выборки уже в приложении, например, реализация на PHP:
function get_id1_id2($rows)
{
  $out = []; // выходная выборка
  $last = 0; // аналог "SELECT @last:=0"
  foreach($rows as $row) // проход по всей исходной выборки
    if($row["ID_1"] > $last) // аналог "WHERE `ID_1` > @last;"
    {
      $last = $row["ID_2"]; // аналог "@last := `ID_2`"
      $out[] = $row; // включение текущей строки в выходную выборку
    }
  return $out;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы