# x is the value to be mapped. # The ranges, a and b, should each be an array defining the # left-most and right-most points of the range. create or replace function maprange(a, b, x) as b[1] + (((x - a[1]) * (b[2] - b[1]::DOUBLE)) / (a[2] - a[1]::DOUBLE)) ; # Example 1: a single value # (Conversion to floating point will be automatic) select maprange([0,10], [-1, 0], 6) as mapped;