web-dev-qa-db-ja.com

WHERE句の列エイリアスの参照

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

私は得る

「無効な列名daysdiff」。

Maxlogtmは日時フィールドです。それは私を夢中にさせる小さなものです。

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

通常、WHERE句でフィールドエイリアスを参照することはできません。 (エイリアスを含むSELECT全体がWHERE句の後に適用されると考えてください。)

しかし、他の回答で述べたように、SQLがSELECT句の前にWHEREを処理するように強制することができます。これは通常、操作の論理的な順序を強制するために括弧で、または共通テーブル式(CTE)で行われます。

括弧/副選択:

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

または、同じのCTEバージョンに関するAdamの回答を参照してください。

158
Jamie F

WHERE句でエイリアスを使用する場合は、サブセレクトまたは 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
69
Adam Wenger

すべての列をCTEにリストしたくない場合、これを行う別の方法は outer apply を使用することです。

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
8
Roman Pekar

コードを繰り返さずにそれを行う最も効果的な方法は、の代わりにを使用してを使用することです。

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

サブクエリを使用してはどうですか(Mysqlでこれが機能しました)。

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

HAVINGは、ドキュメントに従ってMySQLで機能します。

WHEREキーワードを集計関数で使用できないため、HAVING句がSQLに追加されました。

4
roier.rdz

列のエイリアスを参照できますが、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 Demo

長所:

  • 表現の単一の定義(維持しやすい/コピーアンドペーストの必要なし)
  • クエリ全体をCTE/outerqueryでラップする必要はありません
  • WHERE/GROUP BY/ORDER BYで参照する可能性
  • 可能なパフォーマンスの向上(単一実行)
3
Lukasz Szozda