使用 Varchar(Max) 源中的 case 语句的数据类型错误

Posted

技术标签:

【中文标题】使用 Varchar(Max) 源中的 case 语句的数据类型错误【英文标题】:Data type error using case statement from Varchar(Max) source 【发布时间】:2021-10-22 17:01:59 【问题描述】:

我有一个表格,其中包含这些值的范围内的数据。

-0.0011086463928222656, 
0, 
9.318138472735882e-5, 
NA 

源的数据类型是VARCHAR(MAX)。

我正在开发下面的 SELECT 语句,以插入另一个临时表,原因很明显。

SELECT  CASE
            WHEN air_wpa = 'NA' THEN 0.0
            WHEN air_wpa = 0.0 THEN 0.00
            ELSE CONVERT(NUMERIC(18, 9), air_wpa)
        END AS air_wpa
FROM    Table

我收到此错误。

Error converting data type varchar to numeric.

有没有更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

当您在CASE 表达式中比较air_wpa = 0.0 时,将应用Data type precedence 规则,即当比较varchar 列与decimal 常量时,列中的所有值(除了那些匹配第一个WHEN 子句)转换为decimal 数据类型以执行比较。

为避免这种转换,请在比较中使用varchar 常量。此外,如果您使用 SQL Server 2012 或更高版本,当您遇到无法转换为 NUMERIC(18,9) 的值时,可以使用 TRY_CONVERT 获取 NULL 值(而不是错误)。

SELECT  CASE
            WHEN air_wpa = 'NA' THEN 0.0
            WHEN air_wpa = '0.0' THEN 0.00
            ELSE TRY_CONVERT(NUMERIC(18, 9), air_wpa)
        END 'air_wpa'
FROM    TheTable

【讨论】:

是的。惊人的反应。我知道有一个先例问题,但它没有出现在我身上。非常感谢。

以上是关于使用 Varchar(Max) 源中的 case 语句的数据类型错误的主要内容,如果未能解决你的问题,请参考以下文章

Varchar(255) 到 Varchar(MAX)

如何使用 case 语句中的函数返回值以选择每个函数的 MAX?

如果存在,则从字符串中删除第一个和最后一个点

SQL CASE 语句和减号

SQL Server 2012 中的最大行大小与 varchar(max) 字段

如何在 MySQL 中使用 Case When 和 Str_to Date 将 Varchar 日期值转换为日期数据类型