SQL无效列名-WHERE子句中的计算条件

SQL无效列名-WHERE子句中的计算条件,sql,sql-server,Sql,Sql Server,我有以下疑问: SELECT ImgHeight, ImgWidth, IIF(ImgHeight > ImgWidth, ImgHeight, ImgWidth) as imgMaxSize FROM Images WHERE imgMaxSize > 100 但我得到的信息是: 无效的列名“imgMaxSize” 我可以复制如下条件,但两次计算最大值似乎并不有效 SELECT Img1Height, Img1Width, IIF(Img1Height > Img1

我有以下疑问:

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

这里推荐的方法是什么?

在SQL Server中,您可以使用
外部应用来实现以下目的:

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;
当然,CTE和子查询也可以解决这个问题;我只是碰巧使用了横向连接

或:


我应该补充一点,我也非常倾向于ANSI标准语法,除非有充分的理由使用其他语法。因此,
外部应用
有很好的理由
IIF()
而不是
CASE
不是一个很好的理由。

在SQL Server中,您可以使用
外部应用来实现此目的:

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;
当然,CTE和子查询也可以解决这个问题;我只是碰巧使用了横向连接

或:

我应该补充一点,我也非常倾向于ANSI标准语法,除非有充分的理由使用其他语法。因此,
外部应用
有很好的理由
IIF()
而不是
CASE
不是一个很好的理由。

这是:

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

这:

或:


但是把它放在
的地方(就像第二个例子)正是你应该做的。
WHERE
子句是在
SELECT
子句之前运行的,因此在这一点上,SQL-OS不知道什么是imgMaxSize。但是将它放在
WHERE
中(如第二个示例)正是您应该做的。
WHERE
子句在
SELECT
子句之前运行,因此在这一点上,SQL-OS不知道什么是imgMaxSize。如果我理解得很好,在CTE的情况下,整个源表都加载到内存中,因为没有WHERE条件。因此,对于大型表,子查询更有效。我说的对吗?@qub1n你永远不会知道这个活动。SQL Server应该只做您想做的事情,但它自己选择如何做。以这个问题为例。若我理解得很好,在CTE的情况下,整个源表都加载到内存中,因为并没有where条件。因此,对于大型表,子查询更有效。我说的对吗?@qub1n你永远不会知道这个活动。SQL Server应该只做您想做的事情,但它自己选择如何做。以这个问题为例。
with cte as (
    SELECT ImgHeight, ImgWidth,
        IIF(ImgHeight > ImgWidth, ImgHeight, ImgWidth) as imgMaxSize
    FROM Images
);

select * from cte
WHERE imgMaxSize > 100