2016-12-15 90 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