Часть проблемы - то, что столько частей на самом деле легко не истолковано как части. Например, 0.33 не 1/3, это - 33/100. Но если Вы помните свое обучение начальной школы, тогда существует процесс преобразования десятичных значений в части, однако это вряд ли даст Вам, что Вы хотите, так как большинство десятичных чисел времени не хранится в 0,33, но 0.329999999999998 или некоторые такой.
Делают себе одолжение и не беспокоятся этим, но если Вы должны тогда, можно сделать следующее:
Умножают исходное значение на 10, пока Вы не удаляете дробную часть. Сохраните то число и используйте его в качестве делителя. Тогда сделайте ряд упрощений путем поиска общих знаменателей.
Так 0.4 был бы 4/10. Вы тогда искали бы общие делители, запускающиеся с низких значений, вероятно, простые числа. Начиная с 2, Вы видели бы, делит ли 2 и числитель и знаменатель равномерно путем проверки, совпадает ли этаж подразделения с самим подразделением.
floor(5/2) = 2
5/2 = 2.5
Так 5 не делится 2 равномерно. Таким образом Вы проверяете следующее число, говорите 3. Вы делаете это, пока Вы не нападаете или выше квадратного корня меньшего числа.
После того, как Вы сделаете это тогда, Вам нужно
Оператор select в вопросе будет работать. Это не удалось, потому что я не включил псевдоним для встроенного представления.
По какой-то причине это сработает:
select
iv.func_data.a,
iv.func_data.b,
iv.func_data.c
from
(select
test_func(mt.input) as func_data
from
my_table mt) iv
Но это не будет:
select
func_data.a,
func_data.b,
func_data.c
from
(select
test_func(mt.input) as func_data
from
my_table mt)