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

PostgreSQL ISNULL transform null to minimum value of datatype

提问人:Stavros Koureas 提问时间:6/7/2023 最后编辑:Stavros Koureas 更新时间:6/8/2023 访问量:64

问:

我有一个 PostgreSQL 数据库,我有一个从 C# 动态生成的复杂查询。我需要使用 ISNULL 内置函数,该函数在 PostgreSQL 中称为 COALESCE,方法是将其替换为给定数据类型的最小值。

此代码的结果是设置表的最小值,以保留每个表的事务传输状态。设置为最小值,您将在第一次迭代中执行初始加载。

例如,对于整数:

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

例如,对于时间戳:

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#,“minimum”不是很准确,但时间戳的 -infinity 和整数的最小整数将产生相同的结果。

无论输入列数据类型如何,我都可以执行某些操作吗?

PostgreSQL 替换 转换 sqldatatypes 为null

评论

0赞 Frank Heikens 6/7/2023
ISNULL() 是否存在于 PostgreSQL 中?或者你的意思是 COALESCE() ?
0赞 Laurenz Albe 6/7/2023
没有.恐怕没有自动的方法可以做到这一点,你必须为每种数据类型使用一个常量。因为 ,那将是 。ISNULL()timestamp-infinity
0赞 Stavros Koureas 6/7/2023
是的,我忘了,COALESCE也是一样,我只是想不做一个处理案例的功能
0赞 Stavros Koureas 6/7/2023
我真的不明白投反对票的原因,我认为这也应该是对其他人的要求,而您必须在每个表中使用不同的数据类型列执行手动更新插入

答:

0赞 Stavros Koureas 6/8/2023 #1

实际上,我发现在最新的PostgreSQL版本中,浮点数,双精度和数值数据类型也支持用于时间戳的-infinity和+infinity。

对于数字:

SELECT '-infinity'::numeric

对于浮标:

SELECT '-infinity'::float

用于双精度

SELECT '-infinity'::double precision

但仍然不支持 smallint、int 和 big int

对于上述问题,目前,一个可能的解决方案是显式地将输入事务状态(numeric、smallint、integer、bigint 或 timestamp)转换为整数值并存储在日志表中。

然后,在基于列数据类型的下一次迭代中,此整数应恢复为原始数据类型。