SQLのSELECT文で除外するカラムを指定して取得したいとき
今回はSQLのSELECT文で除外するカラムを指定してデータを取得したいときどのようにすれば良いのかについてお話ししていこうと思います。
例えば、testテーブルに「column1」「column2」「column3」があったとして、「column3」を除外して「column1」「column2」を取得したいとき
SELECT column1, column2 FROM test;
ではなく
SELECT column3以外 FROM test;
のような書き方があるのかどうかについてお伝えしていこうと思います。
SQLのSELECT文で除外するカラムを指定して取得したいとき
結論から先に言うと
SELECT column3以外 FROM test;
のような書き方はありません。
ただし動的SQLを使えば間接的に上記のような実行結果を得ることができます。
例としてPostgreSQLのPL/pgSQLブロックを使用する場合は次のようになるでしょう。
「column3」だけではなく「column4」も含めるなど、複数除外するカラムを設定した場合について考えてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
DO $$ DECLARE cols text; target_table_name text := 'test'; -- テーブル名の変数 excluded_columns text[] := ARRAY['column3', 'column4']; -- 除外するカラム名の配列 BEGIN -- カラム名を取得してカンマ区切りの文字列にする SELECT string_agg(column_name, ', ') INTO cols FROM information_schema.columns WHERE table_name = target_table_name AND column_name != ALL(excluded_columns); -- 動的クエリを実行 EXECUTE 'SELECT ' || cols || ' FROM ' || target_table_name; END $$; |
ここから、上記について解説していきます。
まず、
1 2 3 4 |
DECLARE cols text; target_table_name text := 'test'; -- テーブル名の変数 excluded_columns text[] := ARRAY['column3', 'column4']; -- 除外するカラム名の配列 |
の部分で変数を定義しております。
colsというのは最終的に除外したいカラム以外の取得したいカンマ区切りのカラム名リストを格納しております。
target_table_nameは対象のテーブル名で、excluded_columnsは除外したいカラムのリストです。
次に
1 2 3 4 5 6 |
BEGIN -- カラム名を取得してカンマ区切りの文字列にする SELECT string_agg(column_name, ', ') INTO cols FROM information_schema.columns WHERE table_name = target_table_name AND column_name != ALL(excluded_columns); |
については、まずstring_aggは複数の文字列をカンマ(,)で連結して1つの文字列にする関数ですが、これでテーブルのカラム名をすべてカンマ区切りの文字列に変換しています。
そこからcolumn_name != ALL(excluded_columns)
でカラムを除外します。
「information_schema.columns」というのはデータベース内のすべてのテーブルのカラムに関する情報が格納されております。
変数がすべて揃ったら
1 |
EXECUTE 'SELECT ' || cols || ' FROM ' || target_table_name; |
で特定のカラムを除外して取りたい情報が取れます。
後で取得できるように
EXECUTE 'CREATE TEMP TABLE temp_results AS SELECT ' || cols || ' FROM ' || target_table_name;
のように仮のテーブルを作っておくのも良いでしょう。
補足
column_nameに予約語が含まれていた場合は、string_aggの引数にダブルクォートで囲んだcolumn_nameを入れてエスケープしてあげましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
DO $$ DECLARE cols text; target_table_name text := 'test'; -- テーブル名の変数 excluded_columns text[] := ARRAY['column3', 'column4']; -- 除外するカラム名の配列 BEGIN -- カラム名を取得してカンマ区切りの文字列にする SELECT string_agg('"' || column_name || '"', ', ') INTO cols FROM information_schema.columns WHERE table_name = target_table_name AND column_name != ALL(excluded_columns); -- 動的クエリを実行 EXECUTE 'SELECT ' || cols || ' FROM ' || target_table_name; END $$; |
終わりに
今回はSQLのSELECT文で除外するカラムを指定してデータを取得したいときどのようにすれば良いのかについてお話しいたしました。
ディスカッション
コメント一覧
まだ、コメントがありません