如果数据是数字但如果数据是文本时不转换,如何转换为十进制?

问题描述 投票:0回答:4

我正在使用SQL Server 2008 r2。有31个字段(D1-D31)作为varchar,并保留2个格式数据作为数字和文本,如'SD'和'123.456'。

我像这样使用Crystal Report的Data Base Expert命令。

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转换为数字时出错。怎么解决?请..

sql sql-server tsql sql-server-2008-r2
4个回答
3
投票

列具有一种数据类型,因此您不能将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


1
投票

对于SQL Server 2008,您可以使用ISNUMERIC进行检查,其中SQL Server 2012+具有TRY_CONVERTTRY_CAST,使其简单如下。

TRY_CONVERT(decimal(7,2), D1)

1
投票

由于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 Server的一列中组合数据类型。


0
投票

要在数据为数字时进行转换,而在数据为文本时不进行转换,则可以使用isnumeric函数检查类型。

select
  case when isnumeric(D1) then convert(decimal(7,2), D1) else null end as D1_asnumeric
from XXX
© www.soinside.com 2019 - 2024. All rights reserved.