2016-12-15 2 views
0

내가 쿼리 다음 한 WHERE에서 계산 조건 :SQL 잘못된 열 이름 - 절

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 서버에서

+5

그러나'(두 번째 예제처럼)이 정확히 WHERE' 당신이 무엇을해야하는지에 넣어. WHERE 절은 SELECT 절 이전에 실행되므로 SQL-OS는 imgMaxSize가 무엇인지 알지 못합니다. – DVT

답변

3

,이에 대한 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에는 좋은 이유가 있습니다. CASE 대신 IIF()이 좋은 이유는 아닙니다.

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