2016-12-15 65 views
0

我有以下查詢的計算條件:SQL無效的列名 - 在WHERE子句

SELECT ImgHeight, ImgWidth, 
IIF(ImgHeight > ImgWidth, ImgHeight, ImgWidth) as imgMaxSize 
FROM Images 
WHERE imgMaxSize > 100 

但我得到的消息:

無效的列名稱imgMaxSize「。

我可以複製條件如下,但它似乎不是有效的計算兩次最大值。

SELECT Img1Height, 
Img1Width, 
IIF(Img1Height > Img1Width, Img1Height, Img1Width) as imgMaxSize 
From Realty 
where IIF(Img1Height > Img1Width, Img1Height, Img1Width) > 100 

這裏推薦的方法是什麼?

+5

但把它在'WHERE'(如第二個例子)正是你應該做的。 WHERE子句在SELECT語句之前運行,因此SQL-OS不知道什麼是imgMaxSize。 – DVT

回答

3

在SQL Server中,你可以使用outer apply此:

SELECT i.ImgHeight, i.ImgWidth, v.imgMaxSize 
FROM Images i OUTER APPLY 
    (VALUES(CASE WHEN i.ImgHeight > i.ImgWidth THEN i.ImgHeight ELSE i.ImgWidth END) 
    ) v(imgMaxSize) 
WHERE v.imgMaxSize > 100; 

當然,熱膨脹係數和子還解決問題;我只是發生這種使用橫向連接。

或者:

SELECT i.ImgHeight, i.ImgWidth, 
     (CASE WHEN i.ImgHeight > i.ImgWidth THEN i.ImgHeight ELSE i.ImgWidth END) as imgMaxSize 
FROM Images i 
WHERE i.ImgHeight > 100 or i.ImgWidth > 100; 

我要補充一點,我也挺對ANSI標準語法偏差,除非有很好的理由去使用別的東西。因此,outer apply有很好的理由。 IIF()而不是CASE不是一個很好的理由。

1

此:

select * from (
    SELECT ImgHeight, ImgWidth, 
     IIF(ImgHeight > ImgWidth, ImgHeight, ImgWidth) as imgMaxSize 
    FROM Images 
    ) as i 
WHERE imgMaxSize > 100 

或者:

with cte as (
    SELECT ImgHeight, ImgWidth, 
     IIF(ImgHeight > ImgWidth, ImgHeight, ImgWidth) as imgMaxSize 
    FROM Images 
); 

select * from cte 
WHERE imgMaxSize > 100 
+0

如果我明白它好,在CTE的情況下整個源表被加載到內存中,因爲沒有任何條件。所以在大表格的情況下子查詢更有效。我對嗎? – qub1n

+0

@ qub1n你永遠無法知道這個活動。 SQL-Server只應該做你想做的事情,但它選擇如何自己做。作爲一個例子來檢查這個問題。 http://stackoverflow.com/questions/41109677/cte-returning-error – DVT