programing

WHERE 절의 컬럼에일리어스 참조

lastcode 2023. 4. 7. 21:27
반응형

WHERE 절의 컬럼에일리어스 참조

SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120

나는 이해한다

"column name daysdiff" 입니다.

Maxlogtm은 datetime 필드입니다.그건 날 미치게 하는 사소한 것들이야.

SELECT
   logcount, logUserID, maxlogtm,
   DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)

일반적으로 필드 에일리어스를 참조할 수 없습니다.WHERE절을 클릭합니다.(전체라고 생각해 주세요).SELECT에일리어스 포함, 에일리어스 포함,WHERE절)을 참조해 주세요.

그러나 다른 답변에서 언급했듯이 SQL이 강제로 처리하도록 할 수 있습니다.SELECT전에 처리되다WHERE절을 클릭합니다.이것은 보통 논리적인 조작 순서를 강제하기 위해 괄호를 사용하거나 Common Table Expression(CTE; 공통 테이블 표현)을 사용하여 수행합니다.

괄호/하위 선택:

SELECT
   *
FROM
(
   SELECT
      logcount, logUserID, maxlogtm,
      DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
   FROM statslogsummary   
) as innerTable
WHERE daysdiff > 120

또는 동일한 CTE 버전에 대한 Adam의 답변을 참조하십시오.

에일리어스를 사용하는 경우WHEREclause는 서브셀렉트로 랩해야 합니다.또는 CTE:

WITH LogDateDiff AS
(
   SELECT logcount, logUserID, maxlogtm
      , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
   FROM statslogsummary
)
SELECT logCount, logUserId, maxlogtm, daysdiff
FROM LogDateDiff
WHERE daysdiff > 120

코드를 반복하지 않고 실행하는 가장 효과적인 방법은 WHERE 대신 HADING을 사용하는 것입니다.

SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120

CTE의 모든 컬럼을 나열하지 않을 경우 다음을 사용하는 방법도 있습니다.

select
    s.logcount, s.logUserID, s.maxlogtm,
    a.daysdiff
from statslogsummary as s
    outer apply (select datediff(day, s.maxlogtm, getdate()) as daysdiff) as a
where a.daysdiff > 120

서브쿼리(Mysql에서는 가능)를 사용하는 것은 어떻습니까?

SELECT * from (SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary) as 'your_alias'
WHERE daysdiff > 120

HADING은 다음 문서에 따라 MySQL에서 작동합니다.

집계 함수에서 WHERE 키워드를 사용할 수 없기 때문에 HAVING 절이 SQL에 추가되었습니다.

열 별칭을 참조할 수 있지만 다음을 사용하여 정의해야 합니다.CROSS/OUTER APPLY:

SELECT s.logcount, s.logUserID, s.maxlogtm, c.daysdiff
FROM statslogsummary s
CROSS APPLY (SELECT DATEDIFF(day, s.maxlogtm, GETDATE()) AS daysdiff) c
WHERE c.daysdiff > 120;

DBFiddle 데모

장점:

  • 표현의 단일 정의(유지/복사가 필요 없음)
  • CTE/외부 쿼리를 사용하여 쿼리 전체를 정리할 필요가 없습니다.
  • 참조할 가능성WHERE/GROUP BY/ORDER BY
  • 성능 향상 가능성(단일 실행)

WHERE 절에서 ALIAS를 사용하는 가장 간단한 방법은 하위 쿼리를 만들고 대신 하위 쿼리를 선택하는 것입니다.

예:

WITH Q1 AS (
    SELECT LENGTH(name) AS name_length,
    id,
    name
    FROM any_table
)

SELECT id, name, name_length FROM Q1 WHERE name_length > 0

CASE WHEN과 비슷한 모습으로 여기에 와서 다음과 같은 사용을 끝냈습니다.WHERE (CASE WHEN COLUMN1=COLUMN2 THEN '1' ELSE '0' END) = 0아마 너는 이용할 수 있을 것이다DATEDIFF에서WHERE직접적으로.예를 들어 다음과 같습니다.

SELECT logcount, logUserID, maxlogtm
FROM statslogsummary
WHERE (DATEDIFF(day, maxlogtm, GETDATE())) > 120

언급URL : https://stackoverflow.com/questions/8370114/referring-to-a-column-alias-in-a-where-clause

반응형