提问人:Stavros Koureas 提问时间:6/7/2023 最后编辑:Stavros Koureas 更新时间:6/8/2023 访问量:64
PostgreSQL ISNULL 将 null 转换为数据类型的最小值
PostgreSQL ISNULL transform null to minimum value of datatype
问:
我有一个 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 和整数的最小整数将产生相同的结果。
无论输入列数据类型如何,我都可以执行某些操作吗?
答:
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)转换为整数值并存储在日志表中。
然后,在基于列数据类型的下一次迭代中,此整数应恢复为原始数据类型。
评论
ISNULL()
timestamp
-infinity