我有這樣一個觀點:WHERE上查看別名導致錯誤
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
我得到這個錯誤:
Conversion failed when converting the varchar value '-01-' to data type int.
爲什麼?由於位置必須採用1-2-100-0800-A
的格式,因此我看不到可能存在轉換錯誤。在WHERE
有機會過濾結果之前CAST
可能失敗嗎?如果是這樣,那麼爲什麼第一個查詢工作?
編輯 - 變通
我剛做了一個同事提出一個很好的變通。它的工作原理,但它仍不能解釋爲什麼最初的問題。
這是SELECT的ProcessCode:在哪裏之前
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,
出於興趣哪個版本的sql server?以及什麼列類型是位置? –
SQL Server 2012.位置是varchar(24)。 –