【问题标题】:Error converting data type varchar to numeric in sql when value is compared in where clause在 where 子句中比较值时,在 sql 中将数据类型 varchar 转换为数字时出错
【发布时间】:2016-12-14 21:30:33
【问题描述】:

我有一个以 varchar 形式存储的十进制值数据集。 我需要返回所有小于 8.0 的值。 这是我的查询:

;WITH CTE
AS
(
SELECT PatientEncounterID, CAST(value as numeric(3,1)) As Value
from Observation 
where Term = 'HGBA1C' AND isnumeric(value) = 1
)
SELECT *
FROM CTE
WHERE Value < 8.0

当我运行这个查询时,我得到了错误:

将数据类型 varchar 转换为数字

当我在没有 where 子句的情况下运行查询时,值的范围是 5.0 到 16.9。 另一列只是一个身份字段。 Value 字段在 CTE 查询中转换为数字。
为什么where子句会出错?

更新 总行数为 228。应该返回 144,但只返回 39。

【问题讨论】:

  • 小心使用 ISNUMERIC 来隔离实际为数字的值。事物“1e8”、“¢”、“$。”将使用 isnumeric 全部评估为 1,但会在您的谓词中引发异常。对我来说,您遇到的最大问题是将您确定为十进制的内容存储在 varchar 列中。您显然有一些实际上不是小数的值。

标签: sql-server type-conversion numeric


【解决方案1】:

这是查询优化器决定将查询作为单个查询执行的结果。它结合了您的所有WHERE 条件,并选择在ISNUMERIC 检查之前执行Value &lt; 8.0 检查。为了解决这个问题,您需要先过滤所有数值并将其放入临时表中:

INSERT INTO #TempTable
SELECT *
FROM Observation
WHERE
    Term = 'HBGAIC'
    AND ISNUMERIC(Value) = 1;

SELECT *
FROM  #TempTable
WHERE CAST(Value AS NUMERIC(3, 1)) < 8.0;

【讨论】:

  • 成功了!哇……没想到。我认为这就是 CTE 的全部意义所在。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多