Lightning talk material presented at "PostgreSQL Conference 2021 Japan".
メニー・メニー・セレクトPostgresSQL Conference 2021 (2021-11-12) Lightning Talk
View Slide
自己紹介● ぬこ@横浜 (@nuko_yokohama)● にゃーん● 趣味でポスグレをやってる者だ● SELECT なんもわからん
この発表から得られるもの● このレーダーチャートから察してください。即応性汎用性持続性 ぬこ性実用性05安定のぬこクオリティ
今日のお題SELECT だらけの SELECT
こんな SELECT 文をみかけた● ある日、 PostgreSQL 14 上で動作するこんな SELECT 文をみかけたselect=# select "select"."select"::"select" select,"select.select"."select"::"select" selectFROM "select"."select" "select" JOIN "select.select" "select.select"ON ("select"."select"::"select" = "select.select".select::"select");select | select--------+--------select | select(1 row)select=#
このクエリを作ったのは誰だぁ!わたしです
どんだけ select あるねん● こんな短い SELECT 文の中に 25 個の” select” が含まれている。● おまけ:データベース名も select です。select=# select "select"."select"."select"::"select" select,"select.select"."select"::"select" selectFROM "select"."select" "select" JOIN "select.select" "select.select"ON ("select"."select"::"select" = "select.select".select::"select");select | select--------+--------select | select(1 row)select=#
こんな環境で実行した● “select” ENUM data typeselect=# \dT+ selectList of data typesSchema | Name | Internal name | Size | Elements | Owner | Access privileges | Description--------+----------+---------------+------+----------+----------+-------------------+-------------public | "select" | select | 4 | select +| postgres | || | | | "select"+| | || | | | 'select' | | |(1 row)
こんな環境で実行した● “select” table on “select” schema● “select” column in “select” tableselect=# \dnList of schemasName | Owner--------+----------public | postgresselect | postgres(2 rows)select=# \d "select"."select"Table "select.select"Column | Type | Collation | Nullable | Default--------+----------+-----------+----------+---------select | "select" | | |select=#
こんな環境で実行した● “select.select” table on public schema● “select” column in “select” tableselect=# \d public."select.select"Table "public.select.select"Column | Type | Collation | Nullable | Default--------+----------+-----------+----------+---------select | "select" | | |select=#自力では入力できないけど、psql の TAB 補完はサジェストしてくれる
どういうことかというと● SELECT statement command tagselect=# select "select"."select"."select"::"select" select,"select.select"."select"::"select" selectFROM "select"."select" "select" JOIN "select.select" "select.select"ON ("select"."select"::"select" = "select.select".select::"select");select | select--------+--------select | select(1 row)select=#
どういうことかというと● “select” スキーマの” select” 表をエイリアス” select” にする。● ”select” 列を” select” 型でキャスト● ラベル select を付与( PostgreSQL 14 ~ )select=# select "select"."select"."select"::"select" select,"select.select"."select"::"select" selectFROM "select"."select" "select" JOIN "select.select" "select.select"ON ("select"."select"::"select" = "select.select".select::"select");select | select--------+--------select | select(1 row)select=#エイリアス “ select” を定義
どういうことかというと● public スキーマの” < 改行 >select.select< 改行 >” 表のエイリアス” select.select”.”select” 列を” select” 型でキャスト● ラベル select を付与( PostgreSQL 14 ~ )●select=# select "select"."select"."select"::"select" select,"select.select"."select"::"select" selectFROM "select"."select" "select" JOIN "select.select" "select.select"ON ("select"."select"::"select" = "select.select".select::"select");select | select--------+--------select | select(1 row)select=#
どういうことかというと● ”.select” エイリアスの” select” 列を” select” 型でキャスト● ”select.select” エイリアスの” select” 列を” select” 型でキャスト● それを = 比較select=# select "select"."select"."select"::"select" select,"select.select"."select"::"select" selectFROM "select"."select" "select" JOIN "select.select" "select.select"ON ("select"."select"::"select" = "select.select".select::"select");select | select--------+--------select | select(1 row)select=#
まとめ● わかりにくいクエリのコツ– ユーザ定義型に” select” とか使ってみよう– オブジェクト名(スキーマ名、テーブル名、列名)に” select” とか使ってみよう– オブジェクト名に改行を含めると混乱しやすくて楽しいぞ– PostgreSQL 14 から列ラベルに (AS なし ) で select が使えるようになったので使ってみようなるほど?
おわり