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