【问题标题】:Remove decimal values only if all the decimal values are 0仅当所有十进制值为 0 时才删除十进制值
【发布时间】:2020-02-05 23:42:21
【问题描述】:

如果所有值都为零,我需要选择一列删除所有十进制值。

下面是输入表的样子,MYCOLUMN 是一个 numeric(18,2) 类型的字段:

+--------+
|MYCOLUMN|
+--------+
|1.00    |
+--------+
|1.00    |
+--------+
|1.50    |
+--------+
|2.00    |
+--------+
|2.60    |
+--------+

这就是我想要从我的选择中实现的目标:

+--------+
|MYRESULT|
+--------+
|1       |
+--------+
|1       |
+--------+
|1.50    |
+--------+
|2       |
+--------+
|2.60    |
+--------+

我尝试了一个简单的 CASE 语句,但不幸的是它似乎不起作用。

SELECT CASE WHEN MYCOLUMN % 1 <> 0 THEN MYCOLUMN ELSE CONVERT(INT, MYCOLUMN) END as MYRESULT

所有值都保持十进制格式。

【问题讨论】:

  • 请注意——在可能的情况下(例如此处),CAST 通常比 CONVERT 更受欢迎,因为 CONVERT 是特定于 SQL 服务器的,而 CAST 是在 ANSI SQL 标准中。
  • 好吧,3 MOD 1 是...3,所以不会找到你的小数。您可以检查 FLOOR(MyColumn) = MyColumn
  • 格式化数据以供显示最好在表示层完成,而不是在 T-SQL 中完成。
  • 这是因为您不能在单个列中混合数据类型。您可以转换为 int,但小数数据类型具有更高的优先级,因此 int 值将被隐式转换回小数。
  • 谢谢丹和肖恩。明白了。

标签: sql sql-server casting case


【解决方案1】:

您可以尝试以下选项。但由于您不能在单个列中混合数据类型,因此只有在您想要的输出中可以接受 STRING 输出时,您才能采用此选项。

WITH your_table (MYCOLUMN)
AS(
    SELECT 1.00 UNION ALL
    SELECT 2.25
)

SELECT 
CASE 
    WHEN FLOOR(MYCOLUMN) = MYCOLUMN THEN CAST(FLOOR(MYCOLUMN) AS VARCHAR)
    ELSE CAST(MYCOLUMN AS VARCHAR)
END
FROM your_table  

【讨论】:

    【解决方案2】:

    要以不同的格式表示它,您需要转换为字符串。因此,您不妨这样做:

    select replace(cast(col as varchar(255)), '.00', '')
    

    【讨论】:

      【解决方案3】:

      你几乎明白了,你需要的是转换结果而不是 MYCOLUMN 本身。

      所以,这个:

      SELECT CASE WHEN MYCOLUMN % 1 <> 0 THEN MYCOLUMN ELSE CONVERT(INT, MYCOLUMN) END as MYRESULT
      

      应该是这样的:

      SELECT CAST(CASE WHEN MYCOLUMN % 1 <> 0 THEN MYCOLUMN ELSE MYCOLUMN END AS INT) as MYRESULT
      

      不同之处,第一个将MYCOLUMN转换为int,然后将结果作为数字(基本类型)返回。而第二个会将值读取为数字(基本类型),然后获取结果,然后将结果转换为 int。因此,您需要将结果转换为 int,就像我们在第二个中所做的一样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        • 2014-02-05
        • 2018-07-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多