如何在数据为数字时转换为小数但在数据为文本时不转换?

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_CONVERTTRY_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

Demo on db<>fiddle