PostgreSQL ISNULL将null转换为数据类型的最小值

qnzebej0  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(123)

我有一个PostgreSQL数据库,我有一个复杂的查询,它是从C#动态生成的。我需要使用ISNULL内置函数,在PostgreSQL中称为COALESCE,通过替换为给定数据类型的最小值。
此代码的结果是在表上设置最小值,该表保留每个表的事务传输状态。设置为在第一次迭代中执行初始加载的最小值。
例如,对于整数:

SELECT COALESCE(int_value, 0) FROM my_transaction_log_table WHERE schema_name = '' AND table_name = ''

例如,对于timestamp:

SELECT COALESCE(timestamp_value, to_timestamp(0)) FROM my_transaction_log_table WHERE schema_name = '' AND table_name = ''

我在C#中实现了以下代码:

public static string FieldMinimumType(string field_type)
{
    string field_exp;
    switch (field_type)
    {
        case "timestamp without time zone":
            field_exp = string.Format("'1990-01-01 00:00:00'");
            break;
        case "timestamp with time zone":
            field_exp = string.Format("'1990-01-01 00:00:00'");
            break;
        case "smallint":
            field_exp = string.Format("0");
            break;
        case "integer":
            field_exp = string.Format("0");
            break;
        case "bigint":
            field_exp = string.Format("0");
            break;
        case "numeric":
            field_exp = string.Format("0");
            break;
        case "double precision":
            field_exp = string.Format("0");
            break;
        
        default:
            field_exp = string.Format("");
            break;
    };
    return field_exp;
}

当然,基于C#,“最小值”并不是很准确,但是时间戳的-无穷大和整数的最小整数将产生相同的结果。
不管输入列的数据类型如何,我都可以做什么?

3qpi33ja

3qpi33ja1#

实际上,我发现-infinity和+infinity在最新的PostgreSQL版本中也支持float,double precision和numeric数据类型。
对于数字:

SELECT '-infinity'::numeric

对于浮动:

SELECT '-infinity'::float

用于双精度

SELECT '-infinity'::double precision

但仍然不支持smallint,int和big int
对于上述问题,目前,一种可能的解决方案是将输入事务状态(数字,smallint,整数,bigint或时间戳)显式转换为整数值并存储在日志表中。
然后,在基于列数据类型的下一次迭代中,该整数应该恢复到原始数据类型。

相关问题