복붙노트

[SQL] SQL 서버 AS 문 WHERE 문 내에서 열을 별칭

SQL

SQL 서버 AS 문 WHERE 문 내에서 열을 별칭

나는이 'AS'문 및 재사용을 사용하여 열 중 하나의 이름을 변경하는 쿼리를 실행하려면 그 'WHERE'문 내의 별칭 열 이름. 다음은 예입니다 :

SELECT lat AS latitude 
FROM poi_table 
WHERE latitude < 500

문제는 여기에 SQL 서버 때문에 절과 AS 문 이름이 WHERE 절에서 참조되는 WHERE의이 쿼리처럼하지 않습니다. 사람이 이런 일이 왜 내 상황을 개선하기 위해 무엇을 할 수 있는지 설명 할 수 있습니까?

내가 어떻게 그것을 해결합니까, 내가 쿼리의 SELECT 부분에 별칭 것을 수식을 가지고 있었다 가정?

SELECT *, 
( 6371*1000 * acos( cos( radians(42.3936868308) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians(-72.5277256966) ) + sin( radians(42.3936868308) ) * sin( radians( lat ) ) ) ) 
AS distance
FROM poi_table 
WHERE distance < 500;

해결법

  1. ==============================

    1.SQL은 일반적으로 당신이 WHERE, GROUP BY 또는 HAVING 절에 열 별칭을 참조 할 수 없습니다. MySQL은 GROUP BY에 지원 참조 열 별칭을 수행하고 HAVING,하지만 난 다른 데이터베이스에 이러한 쿼리를 이식 ​​할 때 문제가 발생할 것이라고 강조한다.

    SQL은 일반적으로 당신이 WHERE, GROUP BY 또는 HAVING 절에 열 별칭을 참조 할 수 없습니다. MySQL은 GROUP BY에 지원 참조 열 별칭을 수행하고 HAVING,하지만 난 다른 데이터베이스에 이러한 쿼리를 이식 ​​할 때 문제가 발생할 것이라고 강조한다.

    의심, 실제 열 이름을 사용하는 경우 :

    SELECT t.lat AS latitude 
      FROM poi_table t
     WHERE t.lat < 500
    

    나는 쉽게 별칭 대 실제 열이 무엇인지 볼 수 있도록하기 위해 테이블 ​​별명을 추가했다.

    계산 된 열, 하나 같이 당신은 여기를 참조하십시오

    SELECT *, 
           ( 6371*1000 * acos( cos( radians(42.3936868308) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians(-72.5277256966) ) + sin( radians(42.3936868308) ) * sin( radians( lat ) ) ) ) AS distance
      FROM poi_table 
     WHERE distance < 500;
    

    ... 당신은 WHERE 절에 열 별칭을 참조 할 수 변경되지 않습니다. 작업에 해당 쿼리를 들어, 사용해야 할 것이다 :

    SELECT *, 
           ( 6371*1000 * acos( cos( radians(42.3936868308) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians(-72.5277256966) ) + sin( radians(42.3936868308) ) * sin( radians( lat ) ) ) ) AS distance
      FROM poi_table
     WHERE ( 6371*1000 * acos( cos( radians(42.3936868308) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians(-72.5277256966) ) + sin( radians(42.3936868308) ) * sin( radians( lat ) ) ) ) < 500;
    

    하나가 열이있는 경우, 인덱스가 쓸모없는 렌더링 : 컬럼에 함수를 사용하여 (RADIANS (LAT) IE)를주의하십시오.

  2. ==============================

    2.SQL 서버 (즉, 일반적으로 빠른 결과를 얻을 수 있기 때문에)이 별칭을 적용하기 전에 필터를 적용하도록 조정되어 있습니다. 당신은 중첩 된 SELECT 문을 수행 할 수 있습니다. 예:

    SQL 서버 (즉, 일반적으로 빠른 결과를 얻을 수 있기 때문에)이 별칭을 적용하기 전에 필터를 적용하도록 조정되어 있습니다. 당신은 중첩 된 SELECT 문을 수행 할 수 있습니다. 예:

    SELECT Latitude FROM 
    (
        SELECT Lat AS Latitude FROM poi_table
    ) A
    WHERE Latitude < 500
    

    이 쿼리 훨씬 더 장황하게 때문에, 이것이 당신이 찾고있는 것을하지 않을 수 있습니다 알고 있습니다. 더 간결 방법은 기본 테이블을 감싸는보기을하는 것입니다 :

    CREATE VIEW vPoi_Table AS 
    SELECT Lat AS Latitude FROM poi_table
    

    그럼 당신은 말할 수 :

    SELECT Latitude FROM vPoi_Table WHERE Latitude < 500
    
  3. ==============================

    3.당신은 당신이 파생 테이블의 열 이름을 바꿀 수 있습니다해야하는 경우 나, 당신이 "위도"사용할 수없는 이유를 모르지만.

    당신은 당신이 파생 테이블의 열 이름을 바꿀 수 있습니다해야하는 경우 나, 당신이 "위도"사용할 수없는 이유를 모르지만.

    select latitude from (SELECT lat AS latitude FROM poi_table) p where latitude < 500
    
  4. ==============================

    4.이것은 당신의 편집 문제에 작동합니다!

    이것은 당신의 편집 문제에 작동합니다!

    SELECT * FROM (SELECT <Column_List>,  
    ( 6371*1000 * acos( cos( radians(42.3936868308) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians(-72.5277256966) ) + sin( radians(42.3936868308) ) * sin( radians( lat ) ) ) )  
    AS distance 
    FROM poi_table) TMP
    WHERE distance < 500; 
    
  5. ==============================

    5.출처 : http://msdn.microsoft.com/en-us/library/ms189499%28v=sql.110%29.aspx

    출처 : http://msdn.microsoft.com/en-us/library/ms189499%28v=sql.110%29.aspx

  6. ==============================

    6.당신은 당신이 제안하는 일을 할 수없는 이유를 모두 허용 대답과 논리적 처리 순서에 대해 설명합니다.

    당신은 당신이 제안하는 일을 할 수없는 이유를 모두 허용 대답과 논리적 처리 순서에 대해 설명합니다.

    가능한 해결책:

    2008 SQL 서버에서 당신이 사용하는 테이블 생성자 가치와 결합 연산자를 적용 할 수 있습니다 :

    SELECT *, s.distance
    FROM poi_table 
    CROSS APPLY (VALUES(6371*1000*acos(cos(radians(42.3936868308))*cos(radians(lat))*cos(radians(lon)-radians(-72.5277256966))+sin(radians(42.3936868308))*sin(radians(lat))))) AS s(distance)
    WHERE distance < 500;
    

    LiveDemo

  7. from https://stackoverflow.com/questions/3096301/sql-server-as-statement-aliased-column-within-where-statement by cc-by-sa and MIT license