【问题标题】:How to convert a varchar column to decimal?如何将 varchar 列转换为十进制?
【发布时间】:2021-07-29 01:25:35
【问题描述】:

这里是示例数据

-- 创建表架构的脚本

Create table myTable1(
    PREMIUM  varchar(50))

-- 创建所需数据的脚本

Insert into myTable1 
values('25.90')
,('36.98')
,('67.89')
,('')
,('')

如何将 varchar 转换为十进制?我尝试了以下方法,但将 varchar 转换为数字时出错

--script to create table where premium field is converted to decimal
select cast(premium as decimal(12,2)) as prem
into myTable2
from myTable1

【问题讨论】:

  • 您不能将''(空白)转换为十进制。您可以检查其是否为空白然后转换。或者不要在表中使用空格使用 NULLS。
  • 与您的问题无关,但为什么要插入空白行 ('') ?如果您需要空值,请使用 null 而不是 ''
  • decimal 的值是'' 的意思? 1? 0?无穷?还有什么? '' 不是有效数字,因为您收到的错误会告诉您。 真正的问题是,你为什么首先将数值存储为varchar

标签: sql-server


【解决方案1】:

您不能将字符转换为十进制。你可以试试这个忽略空格。

SELECT CASE 
        WHEN PREMIUM = ''
            THEN 0.00
        ELSE CAST(PREMIUM AS DECIMAL(12, 2))
        END AS PREM
INTO myTable2
FROM #myTable1

【讨论】:

    【解决方案2】:

    如果您想忽略无效值并且只想插入有效的小数,您可以使用TRY_PARSE 尝试如下操作。

    select TRY_PARSE (premium as decimal(12,2)) as prem
    into myTable2
    from myTable1
    where TRY_PARSE (premium as decimal(12,2)) IS NOT NULL
    

    或喜欢使用 CTE 关注

    ;WITH CTE AS
    (
    select TRY_PARSE (premium as decimal(12,2)) as prem
    from myTable1
    )
    SELECT * into myTable2 FROM CTE
    where prem IS NOT NULL
    

    您可以阅读更多关于 TRY_PARSE here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      • 2011-06-24
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多