Следующее относится строго к OP-вопросу после ответа @ a-horse-with_no-name: Странно, но оно становится длинным w / out :: integer. Это почему?
Поскольку :: целое число является расширением Postgres к стандартному SQL «селекту выбора (число как целое число)», тип, возвращаемый функцией RANDOM (), имеет двойную точность и остается таким же после TRUN C () функция применяется. То, что отображается, определяется вашей системой.
В общем виде структура val :: data_type говорит о приведении val к указанному data_type (при условии, что существует действительная функция приведения). Если val сам является выражением, формат становится (val) :: data_type. Следующее пошагово показывает, что делает запрос a-horse-with-no-name, и указывает тип данных для этого шага. CTE строго так, что каждый шаг использует то же значение, что и использование random (), каждый раз генерирует разные значения.
with gen as (select random() n)
select n,pg_typeof(n) --step1 get random value interval [0-1).
, n*1000, pg_typeof(n*1000) -- get value into interval [0-999.9999...)
, trunc(n*1000), pg_typeof(trunc(n*1000)) -- reduce to interval [0,999.000)
, trunc(n*1000)::integer, pg_typeof(trunc(n*1000)::integer)
from gen; -- cast to integer interval [0-999)
Кстати, функция trun c () строго не нужна в приведенном выше, как приведение двойное целое число отбрасывает любые десятичные цифры.
Надеюсь, это поможет вам понять, что происходит.