Выбор чисел Фибоначчи

330
05 января 2017, 06:08

Задача не практическая. Хочется оценить, какими подходами ее можно решить на SQL'ях разных диалектов (PostgreSQL, SQLite3, MySQL). И как сложно это решаемо.

Задача

Есть таблица с положительными числами [0..N]. Нужно вывести в порядке возрастания все числа из указанной таблицы, которые входят в последовательность Фибоначчи.

Answer 1

Генератор без использования таблиц для SQLite, postgresql:

WITH Recursive Q(Num,Prev) as(
   select 1,1
  union all
   select Q.Num+Q.Prev,Q.Num
     from Q
    where Q.Num<10000
)
select Num from Q

Если надо выбрать из них только те числа, что есть в некой таблице - то в итоговый select добавить join с этой таблицей для проверки наличия числа в ней.

Для MS SQL и Oracle - убрать из запроса выше фразу Recursive. Для Oracle дополнительно добавить from DUAL после select 1,1.

Для MySQL требуется опорная таблица с нужным количеством записей, содержимое этих записей значения не имеет:

select @tmp:=@Prev+@Num as Num, @Prev:=@Num, @Num:=@tmp
  from seqnum, (select @Prev:=1, @Num:=1) A
 order by Num

Это опять же генератор. Для проверки наличия в некой таблице - заключить в подзапрос и сделать join.

Answer 2

Отвечаю сам себе :) пока для PostgreSQL:

Решается в несколько этапов:

1) Поиск максимального значения в таблице

2) CROSS JOIN всей таблицы с результатом выборки от хранимой процедуры по соответствию

CREATE OR REPLACE FUNCTION fib(f INTEGER) 
RETURNS SETOF INTEGER
LANGUAGE SQL
AS $$
WITH RECURSIVE t(a,b) AS (
        VALUES(0,1)
    UNION ALL
        SELECT greatest(a,b), a + b AS a FROM t
        WHERE b < $1
   )
SELECT a FROM t;
$$;

где аргументом будет максимальное значение из таблицы

Для SQLite3 и MySQL ждем-c ... ) Хотя, чего греха таить, возможно и для PostgreSQL без хранимой процедуры.

READ ALSO
Ошибка в реализации метода Симпсона

Ошибка в реализации метода Симпсона

Может заголовок вопроса и не совсем правильный, извинитеСуть в том, что я пытаюсь реализовать нахождение определённого интеграла (используя...

299
Не нравится напичканность студии

Не нравится напичканность студии

ЗдравствуйтеВесьма странный вопрос

272
Отобразить значение в textView

Отобразить значение в textView

В одном из своих фрагментов, сохраняю нажатый элемент :

315
В чем отличие getExternalFilesDir от getExternalStorageDir?

В чем отличие getExternalFilesDir от getExternalStorageDir?

В чем отличие getExternalFilesDir от getExternalStorageDir???

354