どうも、hosigakiです!
テーブルからデータを抽出するとき、「特定の列だけを除外して抽出したい!」って思うことはありませんか?
今日は、そんな希望を叶える演算子、EXCEPT についてご紹介します!
EXCEPTの使い方
使い方はとても簡単!
以下のように、SELECT句内で全カラム指定しつつ、EXCEPTの括弧内で除外したいカラム名を記載するだけです!
SELECT
* EXCEPT (除外したい列1, 除外したい列2, ...)
FROM
テーブル名
それでは、実際の使い方を見ていきましょう!
EXCEPTの利用例①
例えば、次のusersテーブルから、created_atカラムを除外して抽出するとします。
user_id | name | gender | age | created_at |
---|---|---|---|---|
1 | 太郎 | 男性 | 40 | 2022-1-1 |
2 | よしお | 男性 | 31 | 2022-1-1 |
3 | SAKI | 女性 | 34 | 2022-1-2 |
4 | れいか | 女性 | 30 | 2022-1-3 |
5 | ジム | 男性 | 29 | 2022-1-3 |
6 | さやか | 女性 | 30 | 2022-1-3 |
7 | ボブ | 男性 | 31 | 2022-1-4 |
8 | 健一 | 男性 | 40 | 2022-1-4 |
この時、以下のように、EXCEPTの後ろの( )内に、created_atを記載することで、created_atカラムのみを除外することができます。
SELECT
* EXCEPT (created_at)
FROM
users
user_id | name | gender | age |
---|---|---|---|
1 | 太郎 | 男性 | 40 |
2 | よしお | 男性 | 31 |
3 | SAKI | 女性 | 34 |
4 | れいか | 女性 | 30 |
5 | ジム | 男性 | 29 |
6 | さやか | 女性 | 30 |
7 | ボブ | 男性 | 31 |
8 | 健一 | 男性 | 40 |
ちなみに、created_atカラムだけじゃなく、ageカラムも除外したい場合は、先ほどの( )内にageを追加するだけで、ageも除外できます!
SELECT
* EXCEPT (created_at, age)
FROM
users
EXCEPTの利用例②
以下二つのテーブルを内部結合し、そのレコードを抽出するとします。
user_id | name | gender | age |
---|---|---|---|
1 | 太郎 | 男性 | 40 |
2 | よしお | 男性 | 31 |
3 | SAKI | 女性 | 34 |
user_id | purchase_times | purchase_amount | last_purchased_at |
---|---|---|---|
1 | 10 | 9000 | 2022-8-24 |
2 | 13 | 11000 | 2022-3-1 |
3 | 9 | 21000 | 2022-5-3 |
この時、結合したテーブルを単純に「SELECT *」で抽出すると、抽出結果にuser_idカラムが二つ入ってしまいます。
そこで、例えば以下のクエリを書くと、結合後のテーブルからuser_idカラムを除外することが可能です。
SELECT
* EXCEPT (user_id)
FROM
users
INNER JOIN purchase_count
ON users.user_id = purchase_count.user_id
ただし、実はこれだと、2つのuser_idカラムが両方とも除外されてしまうんです。
(この記事を書いているとき、「EXCEPT (purchase_count.user_id)」とテーブル名を指定したらいけるんじゃないか?と思って、BigQueryで検証したところ、エラーが起こりました。残念ながら、仕様的にこの書き方は許されないようです(;^_^A )
そこで、SELECT句内で別途user_idカラムを抽出対象として選択しておくことで、結果的にuser_idカラムを1つだけ抽出することが可能になります。
SELECT
users.user_id,
* EXCEPT (user_id)
FROM
users
INNER JOIN purchase_count
ON users.user_id = purchase_count.user_id
user_id | name | gender | age | purchase_times | purchase_amount | last_purchased_at |
---|---|---|---|---|---|---|
1 | 太郎 | 男性 | 40 | 10 | 9000 | 2022-8-24 |
2 | よしお | 男性 | 31 | 13 | 11000 | 2022-3-1 |
3 | SAKI | 女性 | 34 | 9 | 21000 | 2022-5-3 |
極論を言ってしまえば、SELECT句内で一つ一つ抽出したいカラム名を書けば、同じ抽出結果を得ることができるのですが、クエリ記載に時間がかかったり、クエリが長くて可読性が落ちたりすることがありますよね(^^;
なので、もしEXCEPTが使えそうな場面があれば、積極的に使ってみるのをお勧めします!
最後まで読んでいただき、ありがとうございました!
また次の記事でお会いしましょう(^^)/