在 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。除非重点是向您展示它们有多可怕! :)
我正在努力实现以下目标:
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。除非重点是向您展示它们有多可怕! :)