我执行了一个非常类似的查询:
SELECT
CAST(A.ValueCol AS INT) * CAST(B.ValueCol AS INT) MultipliedValue
FROM Table1 A
JOIN Table1 B
ON A.LinkCol = B.LinkCol
WHERE
A.TypeCol = <Value that limits ValueCol to only integers>
AND B.TypeCol = <Value that limits ValueCol to only integers>
在这种情况下,ValueCol
是NVARCHAR类型,包含整数值和非整数值.尽管WHERE子句进行了充分的筛选,但对于那些甚至不限定作用域的值,我会得到强制转换错误(例如,如果WHERE筛选了所有非整数值,则SQL正在抛出一个错误,试图强制转换'ABC',它确实存在于表行中,但不应该被拖进这个查询中)。通过独立地删除强制转换和选择两个ValueCol
,我验证了只提取了整数值。
这里是否存在优先/操作顺序问题?在对哪里进行筛选之前,是否将强制转换应用于所有行的ValueCol
?
我知道我可以使用TRY_CAST,只是对SQL中的这种行为感到好奇。谢谢!
发布于 2022-05-26 13:29:14
有时,Server会认为,在应用来自CAST()
子句的筛选之前,对页面(或索引)中的每一行运行像WHERE
这样的操作更有效。
没有什么好办法来避免这种情况。
这就是为什么您不应该将有意义的数据存储在带有不明确类型的列中,这些列具有反模式(如EAV )。
https://stackoverflow.com/questions/72398181
复制