在 WHERE 子句中将 nvarchar 转换为 bigint 失败但在 SELECT 中有效

Error converting nvarchar to bigint in WHERE clause fails but works in SELECT

我正在努力实现以下目标:

Get all Field values where the FieldValue is greater than 100 when the value is stored as a number.

一个值是否存储为数字的指示符由字段类型给出,这是另一个 where 子句。

我面临的问题是,当我尝试在我的 WHERE 语句中进行数据字段转换时,它失败了。

我运行:

SELECT FieldValue FROM CARData A
JOIN Fields B ON A.FieldId = B.FieldId
WHERE FieldTypeId = 3 AND FieldValue IS NOT NULL 

这 return 是以下的预期结果:

但是如果我添加 WHERE 子句以按值过滤:

SELECT FieldValue FROM CARData A
JOIN Fields B ON A.FieldId = B.FieldId
WHERE FieldTypeId = 3 AND FieldValue IS NOT NULL 
AND CAST(FieldValue AS BIGINT) > 100

它抛出错误:

Error converting data type nvarchar to bigint.

我有点理解问题所在 - 它试图将 table 中的所有值转换为 bigint,但在遇到非数字值时失败。

我试图通过在一秒钟内嵌套第一个查询来解决这个问题:

SELECT RESULT.FieldValue FROM (
SELECT FieldValue FROM CARData A
JOIn Fields B ON A.FieldId = B.FieldId
WHERE 
FieldTypeId = 3 
AND FieldValue IS NOT NULL 
AND ISNUMERIC(A.FieldValue) = 1) RESULT
WHERE CAST(FieldValue AS BIGINT) > 100

但即使这样也不会 return 除了上述错误之外的任何其他内容。

虽然更改查询结构确实会导致 SQL 选择不同的计划,但您应该将该技术限制在尝试帮助优化器选择高性能计划。这样做的原因是,如果逻辑的成功执行取决于特定的计划选择,那么当 SQL 决定选择不同的计划时,您的查询今天可能有效但明天(或在生产中)失败。

幸运的是,您不必在这里依赖它!使用 try_cast

SELECT FieldValue FROM CARData A
JOIN Fields B ON A.FieldId = B.FieldId
WHERE FieldTypeId = 3 
AND TRY_CAST(FieldValue AS BIGINT) > 100

我也很好奇...这是 SQL 课程的一部分吗?如果是这样,请告诉您的教师来访问 Whosebug,这样我们就可以告诉他们停止教学生使用 EAV。除非重点是向您展示它们有多可怕! :)