【问题标题】:SELECT FOR JSON outputs exponent on floating pointsSELECT FOR JSON 输出浮点指数
【发布时间】:2018-02-10 07:08:15
【问题描述】:

当我执行以下查询时:

DECLARE @KG FLOAT = 5.0;

WITH Weight(KG, LB) AS (SELECT @KG, @KG * 2.2046226218)
SELECT * FROM Weight;

我得到这个输出:

| KG | LB           |
|----|--------------|
| 5  | 11.023113109 |

现在,当我简单地将 FOR JSON AUTO 附加到输出 JSON 时,

声明@KG FLOAT = 5.0; 重量(KG,LB)为(选择@KG,@KG * 2.2046226218) SELECT * FROM Weight FOR JSON AUTO;

我得到以下输出:

[{"KG":5.000000000000000e+000,"LB":1.102311310900000e+001}]

我知道以上是有效的 JSON,但我想要的输出是:

[{"KG":5,"LB":11.023113109}]

重要提示:我意识到我可以通过简单地将@KG 声明为DECIMALINT 来获得所需的输出。我宁愿不这样做,因为我是从我没有编辑权限的VIEW 中选择的,并且我不想将每个FLOAT 列单独转换为DECIMAL(如果可能)。

有没有办法在不将每个单独的值转换为 DECIMAL 的情况下做到这一点?

【问题讨论】:

  • 你不能将 KG 声明为 int 吗?
  • 再一次,不是真的。我选择的KGLBVIEW 中的其他几列都是FLOAT。不过,我真的很欣赏这个想法。我最好的选择仍然是投。问题中的查询只是重现问题的一种非常简单的方法。我刚刚编辑了原始问题。
  • 我认为演员是唯一的方式
  • 好吧,这就是我害怕的。只有很多列,我更喜欢简单的SELECT * FROM MyView FOR JSON AUTO而不是SELECT CAST(KG AS DECIMAL) KG, CAST(LB AS DECIMAL) LB, [etc ...] FROM MyView FOR JSON AUTO
  • 你不能创建一个包装视图并在那里投射列吗?

标签: sql json sql-server tsql sql-server-2017


【解决方案1】:

你应该使用exact numeric datatypes:

DECLARE @KG DECIMAL(38,12) = 5.0;

WITH Weight(KG, LB) AS (SELECT @KG, @KG * 2.2046226218)
SELECT * FROM Weight FOR JSON AUTO;

DbFiddle Demo

【讨论】:

    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多