【问题标题】:Convert varchar to float IF ISNUMERIC将 varchar 转换为 float IF ISNUMERIC
【发布时间】:2011-05-23 03:38:26
【问题描述】:

我有一列包含字符和数字

12
13
14
19K/YR
22

所以列类型是varchar。但后来我也在用这个列做一些计算,所以我试图将数据转换为浮点数(如果它是数字的)。

这给了我一个错误:

SELECT CASE ISNUMERIC(QTY) 
         WHEN 1 THEN CAST(QTY AS float) 
         ELSE QTY 
       END AS test

【问题讨论】:

  • 你能告诉我们错误是什么吗?

标签: sql sql-server tsql


【解决方案1】:

您不能强制转换为浮动并将字符串保留在同一列中。当 isumeric 返回 0 时,您可以这样做以获取 null。

SELECT CASE ISNUMERIC(QTY) WHEN 1 THEN CAST(QTY AS float) ELSE null END

【讨论】:

  • +1:击败我 - 一列不能超过一种数据类型
  • 当然,除了 ISNUMERIC 再次倒下的事实:SELECT CASE ISNUMERIC('£2') WHEN 1 THEN CAST('£2' AS float) ELSE null END。有没有人发现过 ISNUMERIC 可以在不加掩饰的情况下使用的情况?
  • 在 SQL Server 2012+ 中,您可以使用 TRY_CONVERT():
【解决方案2】:

..扩展 Mikaels 的答案

SELECT
  CASE WHEN ISNUMERIC(QTY + 'e0') = 1 THEN CAST(QTY AS float) ELSE null END AS MyFloat
  CASE WHEN ISNUMERIC(QTY + 'e0') = 0 THEN QTY ELSE null END AS MyVarchar
FROM
  ...
  • 两种数据类型需要两列
  • 添加 e0 修复了一些 ISNUMERIC issues(例如 + - . 并接受空字符串)

【讨论】:

  • 与涉及ints的常见问题不同,此问题涉及转换为float - 那么如果QTY值已经是'1.5e10'(可以转换为float)怎么办?
  • @Damien_The_Unbeliever:在这种情况下它失败了。就我个人而言,我主要使用小数,所以从来不需要完全解决它
【解决方案3】:

我在使用 ISNUMERIC 转换 EmployeeID 值时发现了这个非常烦人的错误:

SELECT DISTINCT [EmployeeID],
ISNUMERIC(ISNULL([EmployeeID], '')) AS [IsNumericResult],

CASE WHEN COALESCE(NULLIF(tmpImport.[EmployeeID], ''), 'Z')
    LIKE '%[^0-9]%' THEN 'NonNumeric' ELSE 'Numeric'
END AS [IsDigitsResult]
FROM [MyTable]

这会返回:

EmployeeID IsNumericResult MyCustomResult ---------- ---------------- -------------- 0 非数字 00000000c 0 非数字 00D026858 1 非数字 (3 行受影响)

希望这会有所帮助!

【讨论】:

    【解决方案4】:

    --试试这个--

    select name= case when isnumeric(empname)= 1 then 'numeric' else 'notmumeric' end from [Employees]
    

    但是转换是不可能的

    select empname=
    case
    when isnumeric(empname)= 1 then empname
    else 'notmumeric'
    end
    from [Employees]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      • 2015-11-05
      • 2013-06-11
      • 2020-03-09
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多