在SQL Server中将负Varchar、Null转换为十进制
我正在尝试将下面的一个度量列值从varchar转换为小数20,3。第三个值是一个空值,没有任何空格,为了让您理解,我用引号括起来。我试过使用CAST,但CAST无法更改数据类型,因为它有负号。但我想保持负值 我试着使用TRY_CONVERT和TRY_CAST,但并没有得到想要的结果。如果有人能帮忙,那就真的很有帮助了。我在下面试过在SQL Server中将负Varchar、Null转换为十进制,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试将下面的一个度量列值从varchar转换为小数20,3。第三个值是一个空值,没有任何空格,为了让您理解,我用引号括起来。我试过使用CAST,但CAST无法更改数据类型,因为它有负号。但我想保持负值 我试着使用TRY_CONVERT和TRY_CAST,但并没有得到想要的结果。如果有人能帮忙,那就真的很有帮助了。我在下面试过 CAST(COALESCE((NULLIF(SalesColumn,'')),'0') AS NUMERIC(20,12)) -992.0 0 您可以在nulli
CAST(COALESCE((NULLIF(SalesColumn,'')),'0') AS NUMERIC(20,12))
-992.0
0
您可以在nullif中添加另一个合并来处理null值。请看下面的例子
declare @var as varchar(50);
set @var=null;
select cast(COALESCE((NULLIF(coalesce(trim(@var),0),'')),'0') AS NUMERIC(20,12))
GO
dbfiddle我使用SQL Server 2017,CAST工作正常,并保持--sign,下面是一个示例。注意舍入,在将其转换为小数20,3之前,您可能需要使用舍入,首先将其转换为精度更高的小数,然后使用舍入,然后将其转换为小数20,3
在NULL上使用CAST-to-numeric或decimal也可以很好地工作
这就是结果
---------------------------------------
-992.123
-45678.000
0.000
0.000
321.000
0.000
(6 rows affected)
请给出一个不适用于您的行或值的具体示例,以及任何错误消息、您得到的结果和您实际想要的结果。目前,该短语无法更改数据类型,因为带有负号的语句太模糊/不明确。使用带有“-992.0”的语句,我得到-992.000000000000000000-不清楚您的问题是什么,所以我希望所有这3个都加载到目标列中,其中我的数据类型是小数20,12。但是使用该语句可以像转换为-992或将NULL转换为零。但总的来说,当我试图用CAST和CONVERT将我的逻辑应用于整个专栏时,它不起作用,你不是新来的,它不起作用,这不是一个有用的评论。准确定义它的功能以及它如何不满足您的目标或期望。我们无法读懂你的心思或看到你的屏幕。是否发生错误?如果是,请发布所有错误消息。如果结果不是您期望的结果,则提供示例数据、生成的输出以及您期望的输出。建议您澄清列的数据类型,因为您使用字符串常量。将数据类型varchar转换为数字错误时出错。虽然我已经尝试了这里给出的所有解决方案,但仍然得到了这个错误。事实上,所有表达式都可以很好地处理单个值,比如只处理数字或空值。但当它试图转换为数值时,使用cast、coalesce和NULLIF,即在整个列上抛出errorcoalescetrim@var,0可以,因此在所有其他周围代码中都没有魔力。
declare @var as varchar(50);
set @var=' ';
select cast(COALESCE((NULLIF(coalesce(trim(@var),0),'')),'0') AS NUMERIC(20,12))
GO
| (No column name) |
| ---------------: |
| 0.000000000000 |
declare @var as varchar(50);
set @var='- 992 ';
select cast(COALESCE((NULLIF(coalesce(trim(@var),0),'')),'0') AS NUMERIC(20,12))
GO
| (No column name) |
| ----------------: |
| -992.000000000000 |
DECLARE
@Val1 VARCHAR(10) = '-992.123'
,@Val2 VARCHAR(10) = '-45678'
,@Val3 VARCHAR(10) = NULL
,@Val4 VARCHAR(10) = ''
,@Val5 VARCHAR(10) = '321'
,@Val6 VARCHAR(10) = ' '
SELECT ISNULL(CAST(NULLIF(A, '') as decimal(20,3)), 0)
FROM (
VALUES (@Val1), (@Val2), (@Val3), (@Val4), (@Val5), (@Val6)
) Sub (A)
---------------------------------------
-992.123
-45678.000
0.000
0.000
321.000
0.000
(6 rows affected)