SQL - SQLite - Python - 高度なSELECT文 - 新たな目でデータを見る - CASEの構築
Head First SQL ―頭とからだで覚えるSQLの基本、 Lynn Beighley(著)、 佐藤 直生(監訳)、 松永 多苗子(翻訳)、 オライリージャパンの 6章(高度なSELECT文 - 新たな目でデータを見る)、p.247(CASEの構築)の解答を求めてみる。
schema3_0.sql
update movie_table
set category =
case
when gore = 'T' and rating = 'R' then 'ホラー/R'
when action = 'T' and rating = 'R' then 'アクション/R'
when drama = 'T' and rating = 'R' then 'ドラマ/R'
when comedy = 'T' and rating = 'R' then 'コメディ/R'
when scifi = 'T' and rating = 'R' then 'SF/R'
when category = 'その他' and rating = 'G' then 'ファミリー/R'
end;
schema3_1.sql
update movie_table
set category =
case
when category = 'ホラー/R' then 'ホラー'
when category = 'アクション/R' then 'アクション'
when category = 'ドラマ/R' then 'ドラマ'
when category = 'コメディ/R' then 'コメディ'
when category = 'SF/R' then 'SF'
when category = 'ファミリー/R' then 'ファミリー'
end;
schema3_2.sql
alter table movie_table drop column drama;
alter table movie_table drop column comedy;
alter table movie_table drop column action;
alter table movie_table drop column gore;
alter table movie_table drop column scifi;
alter table movie_table drop column for_kids;
alter table movie_table drop column cartoon;
コード
sample3.py
#! /usr/bin/env python3
import sqlite3
con = sqlite3.connect('sample.db')
cur = con.cursor()
def p(cur: sqlite3.Cursor, table: str):
cur.execute(
f"""
select * from {table}
"""
)
if (d := cur.description) is not None:
print([t[0] for t in d])
for row in cur.fetchall():
print(row)
p(cur, 'movie_table')
for i in range(3):
with open(f'schema3_{i}.sql') as f:
cur.executescript(f.read())
con.commit()
p(cur, 'movie_table')
cur.close()
con.close()
入出力結果(Terminal, Zsh)
% ./sample3.py
['title', 'rating', 'drama', 'comedy', 'action', 'gore', 'scifi', 'for_kids', 'cartoon', 'category']
('ビッグ・アドベンチャー', 'G', 'F', 'F', 'F', 'F', 'F', 'T', 'F', 'ファミリー')
('グレッグ:語られざる物語', 'PG', 'F', 'F', 'T', 'F', 'F', 'F', 'F', 'アクション')
('狂った道化師', 'R', 'F', 'F', 'F', 'T', 'F', 'F', 'F', 'ホラー')
('13日の金曜日恐怖症', 'R', 'T', 'T', 'T', 'F', 'T', 'F', 'F', 'ドラマ')
('ねずみのダーシー', 'G', 'F', 'F', 'F', 'F', 'F', 'T', 'F', 'ファミリー')
('エンド・オブ・ザ・ライン', 'R', 'T', 'F', 'F', 'T', 'T', 'F', 'T', 'ドラマ')
('シャイニー・シングス', 'PG', 'T', 'F', 'F', 'F', 'F', 'F', 'F', 'ドラマ')
('テイク・イット・バック', 'R', 'F', 'T', 'F', 'F', 'F', 'F', 'F', 'コメディ')
('サメの餌', 'G', 'F', 'F', 'F', 'F', 'F', 'T', 'F', 'ファミリー')
('怒れる海賊', 'PG', 'F', 'T', 'F', 'F', 'F', 'F', 'T', 'コメディ')
('人間が住めるかもしれない惑星', 'PG', 'F', 'T', 'F', 'F', 'T', 'F', 'F', 'コメディ')
['title', 'rating', 'drama', 'comedy', 'action', 'gore', 'scifi', 'for_kids', 'cartoon', 'category']
('ビッグ・アドベンチャー', 'G', 'F', 'F', 'F', 'F', 'F', 'T', 'F', None)
('グレッグ:語られざる物語', 'PG', 'F', 'F', 'T', 'F', 'F', 'F', 'F', None)
('狂った道化師', 'R', 'F', 'F', 'F', 'T', 'F', 'F', 'F', 'ホラー/R')
('13日の金曜日恐怖症', 'R', 'T', 'T', 'T', 'F', 'T', 'F', 'F', 'アクション/R')
('ねずみのダーシー', 'G', 'F', 'F', 'F', 'F', 'F', 'T', 'F', None)
('エンド・オブ・ザ・ライン', 'R', 'T', 'F', 'F', 'T', 'T', 'F', 'T', 'ホラー/R')
('シャイニー・シングス', 'PG', 'T', 'F', 'F', 'F', 'F', 'F', 'F', None)
('テイク・イット・バック', 'R', 'F', 'T', 'F', 'F', 'F', 'F', 'F', 'コメディ/R')
('サメの餌', 'G', 'F', 'F', 'F', 'F', 'F', 'T', 'F', None)
('怒れる海賊', 'PG', 'F', 'T', 'F', 'F', 'F', 'F', 'T', None)
('人間が住めるかもしれない惑星', 'PG', 'F', 'T', 'F', 'F', 'T', 'F', 'F', None)
['title', 'rating', 'drama', 'comedy', 'action', 'gore', 'scifi', 'for_kids', 'cartoon', 'category']
('ビッグ・アドベンチャー', 'G', 'F', 'F', 'F', 'F', 'F', 'T', 'F', None)
('グレッグ:語られざる物語', 'PG', 'F', 'F', 'T', 'F', 'F', 'F', 'F', None)
('狂った道化師', 'R', 'F', 'F', 'F', 'T', 'F', 'F', 'F', 'ホラー')
('13日の金曜日恐怖症', 'R', 'T', 'T', 'T', 'F', 'T', 'F', 'F', 'アクション')
('ねずみのダーシー', 'G', 'F', 'F', 'F', 'F', 'F', 'T', 'F', None)
('エンド・オブ・ザ・ライン', 'R', 'T', 'F', 'F', 'T', 'T', 'F', 'T', 'ホラー')
('シャイニー・シングス', 'PG', 'T', 'F', 'F', 'F', 'F', 'F', 'F', None)
('テイク・イット・バック', 'R', 'F', 'T', 'F', 'F', 'F', 'F', 'F', 'コメディ')
('サメの餌', 'G', 'F', 'F', 'F', 'F', 'F', 'T', 'F', None)
('怒れる海賊', 'PG', 'F', 'T', 'F', 'F', 'F', 'F', 'T', None)
('人間が住めるかもしれない惑星', 'PG', 'F', 'T', 'F', 'F', 'T', 'F', 'F', None)
['title', 'rating', 'category']
('ビッグ・アドベンチャー', 'G', None)
('グレッグ:語られざる物語', 'PG', None)
('狂った道化師', 'R', 'ホラー')
('13日の金曜日恐怖症', 'R', 'アクション')
('ねずみのダーシー', 'G', None)
('エンド・オブ・ザ・ライン', 'R', 'ホラー')
('シャイニー・シングス', 'PG', None)
('テイク・イット・バック', 'R', 'コメディ')
('サメの餌', 'G', None)
('怒れる海賊', 'PG', None)
('人間が住めるかもしれない惑星', 'PG', None)
%