使用 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 语句的数据类型错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 case 语句中的函数返回值以选择每个函数的 MAX?
SQL Server 2012 中的最大行大小与 varchar(max) 字段
如何在 MySQL 中使用 Case When 和 Str_to Date 将 Varchar 日期值转换为日期数据类型