1

我有一个用例,其中 PostgreSQL 数据库中的自定义基本类型对于处理非线性数据非常有益。这方面的示例包括使用 C 函数的输入和输出函数定义。在我的情况下,我宁愿只使用 SQL 定义 inp 和 out 函数,然后使用“LIKE”从双精度继承其他所有内容。有人做过吗?有可能吗?

可能的例子:

-- sample linear to logrithmic functions
CREATE FUNCTION to_linear(anyelement) RETURNS double precision
    LANGUAGE SQL
AS
$$
SELECT CASE WHEN $1 > 0 THEN 30 / log($1::double precision) ELSE 0 END
$$;

create function to_log(anyelement) returns double precision
    language sql
as $$
select 10^($1::double precision/30.0);
$$;

-- create the base type
create type mylogdata
(

    INPUT = to_linear,
    OUTPUT = to_log,
    LIKE = double precision
) ;

-- sample use in a table definition 
CREATE TABLE test_table(
    mydata mylogdata
);

我真正追求的是“sudo”或“部分”基本类型,以允许进行简单的输入输出转换,同时允许现有函数(求和、平均值等)在继承类型上工作(在这种情况下,双精度);基本上避免在 C 中编写/重写函数。

想法?想法?注释?不可能?:)

非常感谢!


附带说明一下,如果我们确实走“C”路线,我认为可能有机会创建更通用的对数标量/基类型,如 Char、Varchar 或任意精度数,这可以允许动态声明对数基数和非线性数据的比例。

对于科学界和我们这些处理基于“波”的数据(如声音、振动、地震、光、辐射等)的人来说,这样的事情可能是一个巨大的胜利。这是基础的示例定义:

对数(底数,刻度)

-- Below my idea for use in a table definition 
-- Obviously the IN/OUT functions would have to be modified to use the base and scaling
-- as defined (  most likely in C ??  )

CREATE TABLE test_table
(
    mydata logarithmic(10, 30)
);

如果有人有兴趣合作创建这样的东西,请告诉我。

4

1 回答 1

0

如果您想编写具有新类型输入和输出函数的数据类型,则必须用 C 编写。毫无疑问,您可以重用double precision.

但我会走另一条路。与其拥有一个看起来像数字但已知算术运算符行为怪异的类型,不如在现有数据类型上定义一组新的运算符。这可以在 SQL 中完成,对我来说感觉更自然。

如果为新运算符创建运算符类,也可以将它们与索引一起使用。

于 2020-02-21T07:37:40.057 回答