2011-07-22 7 views
2

と等しい場所実際に存在する列名ではなく、列に割り当てられた列名を使用するwhere文を記述できますか?テーブル全体は、別のテーブルに格納された列名を使用して動的に作成されます。私は、ユーザーがそれに伴う一連のデータを取得する前に、ジョブをフィルタに追加できるようにする機能を持っています。私がしようとしています何のキャスト列名が

例:

SELECT id, 
    col1 as [description], 
    col2 as [date1], 
    col3 as [image], 
    col4 as [date2], 
    col5 as [link], 
    col6 as [location], 
    col7 as [price], 
    col8 as [title] 
FROM tableName 
WHERE [title] = 'Lemons' 
+2

実際にこれを試しましたか? –

+0

@Chris - 私はOPではないが、あなたがここで何を求めているのか分からない。上記が本当にうまくいかない場合は、OPに尋ねていますか?もしそうなら、答えはイエスです、それは動作しません。 – IAmTimCorey

+0

私が得意とするのは、これをプラグインして実行しようとする方が早いだろうということです。 –

答えて

4

はあなたの元のクエリのサブクエリください:

SELECT * 
FROM (
    SELECT id, 
    col1 as [description], 
    col2 as [date1], 
    col3 as [image], 
    col4 as [date2], 
    col5 as [link], 
    col6 as [location], 
    col7 as [price], 
    col8 as [title] 
    FROM tableName 
) as subquery 
WHERE [title] = 'Lemons' 
3

キースの答えが正しいですが、私は、なぜ時言えます。 WHERE句で列エイリアスを参照することはできません。この理由は、システムがコマンドを処理する順序に基づいているためです。我々はこのコマンドを見て、トップダウンから読む。ただし、データベースエンジンは一連のステートメントに基づいてそれを調べます。最初にFROMステートメントを読み取り、アクセスするテーブルを決定します。次にWHEREステートメントを読み込み、含める/除外するデータを特定します。最後に、SELECTステートメントを調べて、表示するデータを決定します。

WHEREステートメントはこの順序で評価されるため、これらのエイリアスはまだ処理されていないため、SELECTステートメントで作成されたエイリアスにはアクセスできません。したがって、WHERE文で列エイリアスを参照することは厳密には可能ではありません。これを回避する一般的な方法は、文全体をサブクエリ内にラップすることです。この場合の唯一の問題は、パフォーマンスが低下することです。この理由は、すべての行を戻してから、検索前に削除を行う代わりにいくつかの行を削除するからです。

+0

+1のパフォーマンスヒット – Keith