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

Sql 仅当所有十进制值均为0时才删除十进制值,sql,sql-server,casting,case,Sql,Sql Server,Casting,Case,如果所有的值都为零,我需要选择一列来删除所有的十进制值 以下是输入表的外观,MYCOLUMN是一个数字(18,2)类型的字段: +--------+ |MYCOLUMN| +--------+ |1.00 | +--------+ |1.00 | +--------+ |1.50 | +--------+ |2.00 | +--------+ |2.60 | +--------+ 以下是我通过我的选择努力实现的目标: +--------+ |MYRESULT| +

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

以下是输入表的外观,MYCOLUMN是一个数字(18,2)类型的字段:

+--------+
|MYCOLUMN|
+--------+
|1.00    |
+--------+
|1.00    |
+--------+
|1.50    |
+--------+
|2.00    |
+--------+
|2.60    |
+--------+
以下是我通过我的选择努力实现的目标:

+--------+
|MYRESULT|
+--------+
|1       |
+--------+
|1       |
+--------+
|1.50    |
+--------+
|2       |
+--------+
|2.60    |
+--------+
我尝试了一个简单的案例陈述,但不幸的是,它似乎不起作用

SELECT CASE WHEN MYCOLUMN % 1 <> 0 THEN MYCOLUMN ELSE CONVERT(INT, MYCOLUMN) END as MYRESULT
当MYCOLUMN%1为0时选择大小写,然后MYCOLUMN ELSE CONVERT(INT,MYCOLUMN)以MYRESULT结束

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

您可以尝试以下选项。但由于不能在单个列中混合数据类型,所以只有在所需输出中可以接受字符串输出时,才能使用此选项

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  

要以不同的格式表示,需要将其转换为字符串。因此,您不妨:

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

你几乎成功了,你需要的是投射结果,而不是MYCOLUMN本身

那么这个,

SELECT CASE WHEN MYCOLUMN % 1 <> 0 THEN MYCOLUMN ELSE CONVERT(INT, MYCOLUMN) END as MYRESULT
当MYCOLUMN%1为0时选择大小写,然后MYCOLUMN ELSE CONVERT(INT,MYCOLUMN)以MYRESULT结束
应该是这样的:

SELECT CAST(CASE WHEN MYCOLUMN % 1 <> 0 THEN MYCOLUMN ELSE MYCOLUMN END AS INT) as MYRESULT
选择CAST(当MYCOLUMN%1为0时为CASE,然后MYCOLUMN ELSE为INT时为MYCOLUMN END)作为MYRESULT

不同的是,第一个将MYCOLUMN强制转换为int,然后将结果返回为numeric(基本类型)。第二个将读取数值(基类型),然后获取结果,然后将结果转换为int。因此,您需要将结果转换为int,与第二个相同

在可能的情况下(比如这里),通常首选平头转换而不是转换,因为转换是特定于SQL server的,而转换是ANSI SQL标准中的转换。好的,3 MOD 1是…3,所以不会找到小数。您可以检查FLOOR(MyColumn)=MyColumnFormatting data for display是否最好在表示层而不是T-SQL中完成。这是因为您不能在单个列中混合数据类型。您可以转换为整数,但十进制数据类型具有更高的优先级,因此整数值将隐式转换回十进制。谢谢Dan和Sean。知道了。