SQL WHERE 句と計算列: よくある落とし穴
SQL では、日付の違いなど、列を含む計算に基づいてデータをフィルタリングする必要があることがよくあります。 ただし、WHERE
句内で列のエイリアスを直接使用すると、頻繁に「無効な列名」エラーが発生します。これは、SQL が SELECT
句の前に WHERE
ステートメントを処理するためです。つまり、WHERE
句がエイリアスを使用しようとする時点では、エイリアスがまだ定義されていません。
次の例を考えてみましょう:
<code class="language-sql">SELECT logcount, logUserID, maxlogtm, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff FROM statslogsummary WHERE daysdiff > 120;</code>
これは失敗します。
ここでは 2 つの効果的な解決策を紹介します:
1. サブクエリ (または括弧): 値の事前計算
SQL で最初に評価されるようにするには、計算を括弧で囲みます。
<code class="language-sql">SELECT logcount, logUserID, maxlogtm, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff FROM statslogsummary WHERE (DATEDIFF(day, maxlogtm, GETDATE()) > 120);</code>
括弧はサブクエリを作成し、daysdiff
が WHERE
句で使用できるようにします。
2.共通テーブル式 (CTE): 一時テーブルの定義
CTE は名前付きの一時的な結果セットを提供し、計算列をより明確に参照できるようにします。
<code class="language-sql">WITH logDiff AS ( SELECT logcount, logUserID, maxlogtm, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff FROM statslogsummary ) SELECT logcount, logUserID, maxlogtm, daysdiff FROM logDiff WHERE daysdiff > 120;</code>
CTE logDiff
は daysdiff
を事前計算し、メインクエリの WHERE
句でアクセスできるようにします。 このアプローチにより、特により複雑な計算の可読性と保守性が向上します。
以上がSQL WHERE 句で計算列を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。