日期:2014-05-17  浏览次数:20639 次

MSSql跟PostgreSQL的查询结果的小数点差异(求助)
两个数据表在定义时都定义成 
create table table1 (col1 numeric(14,2))

但是查看数据库里两个库的数据显示:
PostgreSQL:20
MSSql     :20.00
用sql文查询出的结果,问题更明显了。
select COALESCE(col1 / 100, 0) from table1
PostgreSQL:0
MSSql     :.000000

我现在在做数据库转换,从PostgreSQL转换到MSSql,因为这些SQL文,会被一些张票,CSV使用,还有些是写入到TXT文件中,TXT文件传给别的程序做输入参数,怕这样的结果会对程序有影响。

请教高手,怎么能屏蔽这种问题。让程序在MSSql中运行的结果跟PostgreSQL的一样。(PostgreSQL 转换到 MSSql)

我现在想从根源 ,也就是SQL文入手,让他们查出的结果都一样。
这里我想用到转换,cast(col1 as numeric(14,2))  ;cast(col1 as numeric(14,0)) 
但是PostgreSQL这个数据库,上面的结果 0的时候他显示0 要是有小数点它又能正常显示小数点,
这样硬转换想必会有漏洞。

请高手指教啊!

------解决方案--------------------
不可以转。
转了就丢数据了。

------解决方案--------------------
最好使用标准SQL,并保证数据类型的一致
------解决方案--------------------
把结果转成字符串,去除尾数0,还要注意小数点。有处理过类似问题
------解决方案--------------------
引用:
谢谢各位了,这两个数据库还真不一样。
通过 CAST(COL1 AS FLOAT) ,查询器里虽然查看是一样,但是在后台程序取到的确实不一样。

postgre:
select col1 from table1
union ALL
select 0  as col1
查询器结果:
20
0
真实结果:
20.00
0

sqlserver:
select col1 from table1
union ALL
select cast(0 as FLOAT)  as col1
查询器结果:
20
0
真实结果:
20
0

可以发现postgre同一个字段可以得到不同精确度的值,而SQLSERVER不能,它只能获得优先级最高的类型和精确度。


你说的对,sql server只会按照优先级最后的类型和精度,来转化 合并的。

很多数据库都不同,包括:oracle和sql server也不同。