我有一个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#,“最小值”并不是很准确,但是时间戳的-无穷大和整数的最小整数将产生相同的结果。
不管输入列的数据类型如何,我都可以做什么?
1条答案
按热度按时间3qpi33ja1#
实际上,我发现-infinity和+infinity在最新的PostgreSQL版本中也支持float,double precision和numeric数据类型。
对于数字:
对于浮动:
用于双精度
但仍然不支持smallint,int和big int
对于上述问题,目前,一种可能的解决方案是将输入事务状态(数字,smallint,整数,bigint或时间戳)显式转换为整数值并存储在日志表中。
然后,在基于列数据类型的下一次迭代中,该整数应该恢复到原始数据类型。