質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

4回答

6247閲覧

sql: select句で「*ただし「○○以外」の列」という風に抽出したい

esklia

総合スコア81

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/07/29 02:24

編集2021/07/29 02:26

表題の通り、 select句で「以外」を使用できると非常に便利そうなので、その方法があれば教えていただきたいです。

例えば以下のテーブルはjoinを複数回使用しているので、
aisle_id、aisle_id_1
department_id、department_id_1
のように重複が発生しています。
これを[aisle_id_1、department_id_1]以外、というように変数定義、または構文で指定する方法はあるのでしょうか。

select * ただし[aisle_id_1、department_id_1]のように、またはほかの方法でも目的を達成する方法で書きたいです。

よろしくお願いいたします。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

(質問の画像の)BigQueryは*演算子の修飾子として、(select * except)というのがあるみたいですね。
https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax?hl=ja#select_except

以下のリンクで説明されてます。
[BigQuery] 一部のカラムだけクエリしたくない場合はexcept関数があるよ - Qiita

投稿2021/08/03 00:33

phare

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

たまに色んな場所で見るのですが、ありません。

よくあるのはテーブル定義書からコピペというやり方。
また、記述が面倒なら*で取って利用するアプリケーション側で取捨選択するのもありです。

投稿2021/07/29 02:30

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

esklia

2021/07/29 02:35 編集

ご回答ありがとうございます。やはりないのですね。実務経験がないので定義書を「列名やスキーマ一覧」と解釈しますが、いまのところクエリ結果をコピペしてエディタ駆使してせっせと選択するのが自分のスキルレベルでのベストプラクティスになりそうです。 >>記述が面倒なら*で取って利用するアプリケーション側で取捨選択するのもありです。 これは、目的の方法で書けるように関数定義せよということでしょうか。
m.ts10806

2021/07/29 03:50

>これは、目的の方法で書けるように関数定義せよということでしょうか。 いいえ。多くの場面でSQLだけ使うというのはないので全列指定である * でSELECTし、アプリケーション側でほしい列だけ取り出すということです。
esklia

2021/07/29 04:35

ありがとうございます。理解できました。
guest

0

そもそもまっとうな検索で「」はつかわないですからね
基本はカラム名の列記です(テスト中とかは
で十分な場合もありますが)

viewを作っておけば済む話ですし
どうしても動的に処理したいならプロシージャでも実現できるでしょう

投稿2021/07/29 02:35

yambejp

総合スコア116734

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

esklia

2021/07/29 02:45

ご回答ありがとうございます。 >>そもそもまっとうな検索で「*」はつかわないですからね そうなのですね。自分で複数テーブルjoinしてクエリ結果を新たなテーブルに出力するくらいならば*でも問題ないかと思ったのですが、実務を想定された場合可読性の観点からそのように思います。ほかの観点であれば、少しその理由が気になりますが、何分実務経験がないので、、 viewやプロシージャに関しては、完全に自分のスキル不足かもしれません。viewはともかく、プロシージャは初耳なもので…ご助言誠にありがとうございます。
yambejp

2021/07/29 03:07

あとはミドルウェアやアプリ側の課題です カラム名がわからなくても列番号で値を参照する方法もあるので ○○を除くという機能は必ずしも必要ではありません
esklia

2021/07/29 04:35

そうなのですね。教えていただきたいありがとうございます。
guest

0

カラム名が重複するなら、テーブル名.カラム名、
もしくはテーブルに対するエイリアス名を与えてあれば、エイリアス名.カラム名、
でユニークに指定できるので、何も困らないかと。

FROM longtablename_1 AS T
みたいなふうなら、
SELECT T.column_1, T.column_2, TT.column_1, TT.column_2 FROM longtablename_1 AS T LEFT JOIN longtablename_2 as TT ON ~
みたいにできるので。

投稿2021/07/29 02:28

編集2021/07/29 02:30
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

esklia

2021/07/29 02:32

ご回答ありがとうございます。 a,bテーブルがあるとして、 a.aisle_id とすればよいということですよね。 それだとselectしたい列をすべて列記しなければいけなくなるので、 「*と「○○以外」」と書けば短く書けると思った次第です。
退会済みユーザー

退会済みユーザー

2021/07/29 02:38 編集

あいまいさを排除することと、抽出したい内容を正確に指定するための仕組みとして、 こういう文法が決まっているのであって、 質問者さんが期待するような楽な文法はないです。 せめて、元となるSELECT文をDB管理ツールの類で機械生成してコピペ改変することで、 転記ミスを防ぐことならできますが。 仮に*を書くと100個カラムが抽出されるけど実際使いたいのは20個程度だとしたら、 必死こいて20個カラム名を書いた方がパフォーマンスが良いです。 使うデータのみ抽出することに徹してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問