[SQL] SQL 서버 AS 문 WHERE 문 내에서 열을 별칭
SQLSQL 서버 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.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.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.당신은 당신이 파생 테이블의 열 이름을 바꿀 수 있습니다해야하는 경우 나, 당신이 "위도"사용할 수없는 이유를 모르지만.
당신은 당신이 파생 테이블의 열 이름을 바꿀 수 있습니다해야하는 경우 나, 당신이 "위도"사용할 수없는 이유를 모르지만.
select latitude from (SELECT lat AS latitude FROM poi_table) p where latitude < 500
-
==============================
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.출처 : 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.당신은 당신이 제안하는 일을 할 수없는 이유를 모두 허용 대답과 논리적 처리 순서에 대해 설명합니다.
당신은 당신이 제안하는 일을 할 수없는 이유를 모두 허용 대답과 논리적 처리 순서에 대해 설명합니다.
가능한 해결책:
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
from https://stackoverflow.com/questions/3096301/sql-server-as-statement-aliased-column-within-where-statement by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL의 경우 문, 어떻게 여러 변수를 반환? (0) | 2020.07.03 |
---|---|
[SQL] 변수 파일 이름으로 대량 삽입 (0) | 2020.07.03 |
[SQL] 콜렉션의 크기가 0 또는 비어있는 경우 쿼리 HQL 확인하기 (0) | 2020.07.03 |
[SQL] 제약 조건은 DEFERRABLE이 INITIALLY IMMEDIATE 여전히 지연됩니다 정의? (0) | 2020.07.02 |
[SQL] 어떻게 안전 SQL 문자열로 문자열을 변환합니까? (0) | 2020.07.02 |