私はこのような見方をしています:
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に変換するときに変換に失敗しました。
なんで?場所はの形式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,