仅当所有十进制值均为0时,才删除十进制值

时间:2019-10-08 16:35:01

标签: sql sql-server casting case

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

这是输入表的样子,MYCOLUMN是一个数字(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

所有值均保留为十进制格式。

3 个答案:

答案 0 :(得分:0)

您可以在下面的选项中尝试。但是由于您不能在单个列中混合使用数据类型,因此只有在所需的输出中可接受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  

答案 1 :(得分:0)

要以不同格式表示此内容,您需要转换为字符串。因此,您也可以这样做:

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

答案 2 :(得分:0)

您几乎明白了,您需要的是转换结果,而不是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,就像在第二个示例中所做的一样。