我有这样的看法:
SELECT location, CAST(SUBSTRING(location, 9, 4) AS int) AS ProcessCode
FROM dbo.asset
WHERE (status NOT IN ('INACTIVE', 'NOT READY', 'LIMITEDUSE'))
AND (location LIKE '[1-6]-[12]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-_')
如果我这样称呼它,它会起作用:
SELECT * FROM FooView
但是,如果我添加 WHERE 子句:
SELECT * FROM FooView WHERE ProcessCode > 0
我收到此错误:
将 varchar 值“-01-”转换为数据类型 int 时转换失败。
为什么?由于 location 必须是 format 1-2-100-0800-A
,我看不出怎么会出现转换错误。是否有可能在有机会过滤结果CAST
之前失败?WHERE
如果是这样,那么为什么第一个查询有效?
编辑 - 解决方法
我刚刚让一位同事建议了一个好的解决方法。它有效,但它仍然没有解释为什么最初的问题。
这是在 ProcessCode 的 SELECT 中:
CASE WHEN location LIKE '[1-6]-[12]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-_'
THEN CAST(SUBSTRING(location, 9, 4) AS int) ELSE 0 END AS ProcessCode,