MySQL 쿼리의 WHERE 절에서 열 별칭을 사용하면 오류가 발생합니다.
실행 중인 쿼리는 다음과 같습니다만, 이 에러가 발생하고 있습니다.
#1054 - 'IN/ALL/ANY 서브쿼리'의 알 수 없는 열 'guarantee_postcode'
SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE `guaranteed_postcode` NOT IN #this is where the fake col is being used
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
'australia'
)
)
질문입니다. 같은 DB 쿼리의 where 절에 가짜 컬럼을 사용할 수 없는 이유는 무엇입니까?
GROUP BY, ORDER BY 또는 HAVING 절에서만 열 별칭을 사용할 수 있습니다.
표준 SQL에서는 WHERE 절의 열 별칭을 참조할 수 없습니다.WHERE 코드가 실행될 때 열 값이 아직 결정되지 않을 수 있기 때문에 이 제한이 적용됩니다.
MySQL 문서에서 복사했습니다.
댓글에 지적된 바와 같이 HAVING을 사용하여 작업을 수행할 수 있습니다.이 질문도 꼭 읽어주세요: WHERE vs HAVING.
빅터가 지적했듯이, 문제는 가명에 있다.단, 이 식을 WHERE x IN y 절에 직접 삽입하면 이를 피할 수 있습니다.
SELECT `users`.`first_name`,`users`.`last_name`,`users`.`email`,SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN #this is where the fake col is being used
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
'australia'
)
)
그러나 외부 쿼리의 모든 행에 대해 하위 쿼리를 실행해야 하므로 매우 비효율적이라고 생각합니다.
표준 SQL(또는 MySQL)에서는 WHERE 절에서 열 별칭을 사용할 수 없습니다.
WHERE 절을 평가할 때 열 값이 아직 결정되지 않았을 수 있습니다.
(MySQL 매뉴얼 참조).WHERE 절의 열 값을 계산하여 변수에 저장하고 필드 목록에서 사용할 수 있습니다.예를 들어 다음과 같이 할 수 있습니다.
SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
@postcode AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE (@postcode := SUBSTRING(`locations`.`raw`,-6,4)) NOT IN
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
'australia'
)
)
이렇게 하면 식이 복잡해질 때 반복되지 않기 때문에 코드를 쉽게 유지할 수 있습니다.
내 대답이 너무 늦었을 수도 있지만 이것은 다른 사람들에게 도움이 될 수 있다.
다른 select 문장으로 둘러싸서 where 절을 사용할 수 있습니다.
SELECT * FROM (Select col1, col2,...) as t WHERE t.calcAlias > 0
calcAlias는 계산된 별칭 열입니다.
SELECT 필드 및 별칭에서 계산된 필터에 HAVING 절을 사용할 수 있습니다.
mysql 5.5.24를 사용하고 있는데 다음 코드가 작동합니다.
select * from (
SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
) as a
WHERE guaranteed_postcode NOT IN --this is where the fake col is being used
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
'australia'
)
)
SUBSTRING()을 사용할 수 있습니다.locations
.raw
,-6,4)의 경우
SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN #this is where the fake col is being used
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
'australia'
)
)
언급URL : https://stackoverflow.com/questions/942571/using-column-alias-in-where-clause-of-mysql-query-produces-an-error
'itsource' 카테고리의 다른 글
요소를 어레이에 특정 위치에 삽입하려면 어떻게 해야 합니까? (0) | 2022.09.13 |
---|---|
MySQL과 다른 MariaDB 프로토콜 문서를 찾을 수 있는 위치 (0) | 2022.09.13 |
Panda 데이터 프레임을 디스크에 역방향으로 저장하고 디스크에서 로드하는 방법 (0) | 2022.09.13 |
MariaDB가 있는 데이터베이스 손상: 엔진에 테이블이 없습니다. (0) | 2022.09.13 |
phpMyAdmin 오류:mbstring 확장자가 없습니다.PHP 구성을 확인하십시오. (0) | 2022.09.13 |