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」も含めるなど、複数除外するカラムを設定した場合について考えてみます。

ここから、上記について解説していきます。

まず、

の部分で変数を定義しております。
colsというのは最終的に除外したいカラム以外の取得したいカンマ区切りのカラム名リストを格納しております。
target_table_nameは対象のテーブル名で、excluded_columnsは除外したいカラムのリストです。

次に

については、まずstring_aggは複数の文字列をカンマ(,)で連結して1つの文字列にする関数ですが、これでテーブルのカラム名をすべてカンマ区切りの文字列に変換しています。
そこからcolumn_name != ALL(excluded_columns)でカラムを除外します。
「information_schema.columns」というのはデータベース内のすべてのテーブルのカラムに関する情報が格納されております。

変数がすべて揃ったら

で特定のカラムを除外して取りたい情報が取れます。

後で取得できるように
EXECUTE 'CREATE TEMP TABLE temp_results AS SELECT ' || cols || ' FROM ' || target_table_name;
のように仮のテーブルを作っておくのも良いでしょう。

補足

column_nameに予約語が含まれていた場合は、string_aggの引数にダブルクォートで囲んだcolumn_nameを入れてエスケープしてあげましょう。

終わりに

今回はSQLのSELECT文で除外するカラムを指定してデータを取得したいときどのようにすれば良いのかについてお話しいたしました。

最後までお読みいただきありがとうございます。
よろしければブログやTwitterでのシェアをお願いしております。
コメントもお待ちしております。
誤植や勘違いなどございましたらコメント欄にて教えていただけると幸いです。

直接契約ができるフリーランスエージェント「エンハンス」を立ち上げました。
詳しくは下記LPをご参照ください。
https://enhance.decryption.co.jp/

Youtubeチャンネル開設いたしました。
チャンネル登録者1000人を目指しているので、良いと思った方はチャンネル登録をお願いしたいです。
https://www.youtube.com/channel/UC219XhmSRxmXltTy6COxSMw






DB

Posted by ちこ