当字段为数字时转换为数字
Cast as numeric when field isnumeric
我正在使用一个视图,其中的列包含一个 varchar,它的值可以类似于 8.60
或 V
或 NULL
.
我正在尝试创建一个 select 语句,在可能的情况下将值转换为数字,否则 return 原始值。
所以我想出了这个测试查询:
SELECT
CASE
WHEN ISNUMERIC('V') = 1
THEN cast(round('V', 1) as numeric(4,1))
ELSE 'V'
END
as Value;
我希望它 return V
,但我收到一个错误:Error converting data type varchar to numeric.
我试过 TRY_PARSE
和 TRY_CAST
以及 round
和 cast
都没有成功。错误似乎与 THEN
子句有关,因为没有,它不会引发错误。
我该如何写这个查询?
SQL 版本: Microsoft SQL Server 2014 (SP2-GDR) (KB4019093) - 12.0.5207.0 (X64)
使用:Microsoft SQL Server Management Studio v12.0.2000.8
一个case
表达式returns一个单一的值。该值具有单一类型。您的 case
表达式同时返回数字和字符串。数字优先,因此 SQL 服务器尝试将字符串转换为数字。
因此,你的错误。
您可以通过放弃 'V'
并仅使用 NULL
:
来解决此问题
SELECT (CASE WHEN ISNUMERIC('V') = 1
THEN cast(round('V', 1) as numeric(4,1))
ELSE NULL
END) as Value;
或者,更简单地说:
SELECT TRY_CONVERT(numeric(4, 1), 'V')
注意:我假设您打算 'V'
作为示例字符串值而不是列。如果是一列,单引号就错了。
一个 case 表达式不能 return 多种数据类型。 SQL 服务器必须将所有分支的结果转换为一种数据类型。根据数据类型优先规则 numeric
比 varchar
具有更高的优先级,因此它将 v
转换为数字。不过,您可以将数值转换为 varchar。
话虽如此,我不鼓励使用 ISNUMERIC
,因为它 return 对于 $
和 -
等无意义的值是正确的。按照其他答案中的建议使用 TRY_CAST
:
SELECT CASE
WHEN TRY_CAST(v AS NUMERIC(4, 1)) IS NOT NULL THEN
CAST(CAST(v AS NUMERIC(4, 1)) AS VARCHAR(100)) -- cast will round as well
ELSE v
END
我正在使用一个视图,其中的列包含一个 varchar,它的值可以类似于 8.60
或 V
或 NULL
.
我正在尝试创建一个 select 语句,在可能的情况下将值转换为数字,否则 return 原始值。
所以我想出了这个测试查询:
SELECT
CASE
WHEN ISNUMERIC('V') = 1
THEN cast(round('V', 1) as numeric(4,1))
ELSE 'V'
END
as Value;
我希望它 return V
,但我收到一个错误:Error converting data type varchar to numeric.
我试过 TRY_PARSE
和 TRY_CAST
以及 round
和 cast
都没有成功。错误似乎与 THEN
子句有关,因为没有,它不会引发错误。
我该如何写这个查询?
SQL 版本: Microsoft SQL Server 2014 (SP2-GDR) (KB4019093) - 12.0.5207.0 (X64)
使用:Microsoft SQL Server Management Studio v12.0.2000.8
一个case
表达式returns一个单一的值。该值具有单一类型。您的 case
表达式同时返回数字和字符串。数字优先,因此 SQL 服务器尝试将字符串转换为数字。
因此,你的错误。
您可以通过放弃 'V'
并仅使用 NULL
:
SELECT (CASE WHEN ISNUMERIC('V') = 1
THEN cast(round('V', 1) as numeric(4,1))
ELSE NULL
END) as Value;
或者,更简单地说:
SELECT TRY_CONVERT(numeric(4, 1), 'V')
注意:我假设您打算 'V'
作为示例字符串值而不是列。如果是一列,单引号就错了。
一个 case 表达式不能 return 多种数据类型。 SQL 服务器必须将所有分支的结果转换为一种数据类型。根据数据类型优先规则 numeric
比 varchar
具有更高的优先级,因此它将 v
转换为数字。不过,您可以将数值转换为 varchar。
话虽如此,我不鼓励使用 ISNUMERIC
,因为它 return 对于 $
和 -
等无意义的值是正确的。按照其他答案中的建议使用 TRY_CAST
:
SELECT CASE
WHEN TRY_CAST(v AS NUMERIC(4, 1)) IS NOT NULL THEN
CAST(CAST(v AS NUMERIC(4, 1)) AS VARCHAR(100)) -- cast will round as well
ELSE v
END