Задача не практическая. Хочется оценить, какими подходами ее можно решить на SQL'ях разных диалектов (PostgreSQL
, SQLite3
, MySQL
). И как сложно это решаемо.
Задача
Есть таблица с положительными числами [0..N]
. Нужно вывести в порядке возрастания все числа из указанной таблицы, которые входят в последовательность Фибоначчи.
Генератор без использования таблиц для 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.
Отвечаю сам себе :) пока для 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 без хранимой процедуры.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Может заголовок вопроса и не совсем правильный, извинитеСуть в том, что я пытаюсь реализовать нахождение определённого интеграла (используя...
В чем отличие getExternalFilesDir от getExternalStorageDir???