如何在数据为数字时转换为小数但在数据为文本时不转换?
How to convert to decimal when data is number but not convert when data is text?
我正在使用 SQL Server 2008 r2。
有 31 个字段 (D1-D31) 为 varchar,并保留 2 种格式数据作为数字和文本,例如 'SD' 和 '123.456'。
我使用Crystal数据库专家的命令是这样的报告。
select
case
when D1 in('SD') then d1
when D1 is NULL then ''
else convert(decimal(7,2),d1)
end
.
.
.
case D2-D31
from Rec2019 where ID ='P0009'
显示将数据类型 varchar 转换为数字时出错。
如何解决?请..
数据为数字时转换,数据为文本时不转换,可以用isnumeric函数检查类型。
select
case when isnumeric(D1) then convert(decimal(7,2), D1) else null end as D1_asnumeric
from XXX
由于 ISNUMERIC 有一些小缺点,例如数字的科学计数法,我会使用 TRY_CAST,如下所示:(注意:SQLServer 2012+)
CREATE TABLE #T (ColA VARCHAR (10))
INSERT INTO #T VALUES ('1'), ('A'), ('2');
SELECT *, TRY_CAST (ColA AS DECIMAL (4,2)) AS Numb
FROM #T
旁注:一列有一种数据类型,您不能在 SQL 服务器的一列中组合数据类型。
对于 SQL Server 2008
,您可以使用 ISNUMERIC
进行检查,其中 SQL Server 2012+ 具有 TRY_CONVERT
或 TRY_CAST
以使其变得简单,如下所示.
TRY_CONVERT(decimal(7,2), D1)
一列只有一种数据类型,因此您不能在同一列中放置 DECIMAL 和 VARCHAR 值。我想你想舍入数字值。在这种情况下,您可以使用以下内容:
CASE
WHEN ISNUMERIC(d1) = 1 AND d1 NOT IN ('+', '-', '$') THEN CAST(CAST(d1 AS DECIMAL(7, 2)) AS VARCHAR(9))
WHEN d1 IS NULL THEN ''
ELSE d1
END
我正在使用 SQL Server 2008 r2。 有 31 个字段 (D1-D31) 为 varchar,并保留 2 种格式数据作为数字和文本,例如 'SD' 和 '123.456'。
我使用Crystal数据库专家的命令是这样的报告。
select
case
when D1 in('SD') then d1
when D1 is NULL then ''
else convert(decimal(7,2),d1)
end
.
.
.
case D2-D31
from Rec2019 where ID ='P0009'
显示将数据类型 varchar 转换为数字时出错。 如何解决?请..
数据为数字时转换,数据为文本时不转换,可以用isnumeric函数检查类型。
select
case when isnumeric(D1) then convert(decimal(7,2), D1) else null end as D1_asnumeric
from XXX
由于 ISNUMERIC 有一些小缺点,例如数字的科学计数法,我会使用 TRY_CAST,如下所示:(注意:SQLServer 2012+)
CREATE TABLE #T (ColA VARCHAR (10))
INSERT INTO #T VALUES ('1'), ('A'), ('2');
SELECT *, TRY_CAST (ColA AS DECIMAL (4,2)) AS Numb
FROM #T
旁注:一列有一种数据类型,您不能在 SQL 服务器的一列中组合数据类型。
对于 SQL Server 2008
,您可以使用 ISNUMERIC
进行检查,其中 SQL Server 2012+ 具有 TRY_CONVERT
或 TRY_CAST
以使其变得简单,如下所示.
TRY_CONVERT(decimal(7,2), D1)
一列只有一种数据类型,因此您不能在同一列中放置 DECIMAL 和 VARCHAR 值。我想你想舍入数字值。在这种情况下,您可以使用以下内容:
CASE
WHEN ISNUMERIC(d1) = 1 AND d1 NOT IN ('+', '-', '$') THEN CAST(CAST(d1 AS DECIMAL(7, 2)) AS VARCHAR(9))
WHEN d1 IS NULL THEN ''
ELSE d1
END