Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
PostgreSQL 9.4 
SELECT 文の 
微妙な強化 
ぬこ@横浜(@nuko_yokohama)
自己紹介 
「ぬこ@横浜」で検索 
ラーメンの食べ歩きと 
無駄なPostgreSQL 拡張を考えるのが趣味 
漢数字型とか、 
neo4j_fdwとか 
ゆるい全文検索拡張とか 
psql上の数当てとか 
PostgreSQL 本 
書きまし...
現在β2 リリース中の 
PostgreSQL 9.4
ロジカルデコーディング 
マテリアライズド・ビュー改善 
JSONB 対応 
ALTER SYSTEM 
等々の改善
それだけでなく、地味~な 
改造が各所に加わっている。 
SELECT 文にもちょっとした 
改造が入っています。
SELECT 文の3 つの改善 
選択リストなしSELECT 
WITH ORDINALITY 
ROWS FROM()
選択リストなしSELECT 
Allow SELECT with an empty target list (Tom Lane) 
This was added so views that select from a table 
with z...
選択リストなしSELECT 
PostgreSQL 9.3 まで 
test=# SELECT ; 
ERROR: syntax error at or near ";" 
LINE 1: SELECT ; 
^ 
test=# 
ですよねー
選択リストなしSELECT 
PostgreSQL 9.4 から 
test=# SELECT ; 
-- 
(1 row) 
test=# 
ファッ? 
というか誰得なんだこの機能
選択リストなしSELECT 
Allow SELECT with an empty target list (Tom Lane) 
This was added so views that select from a table 
with z...
選択リストなしSELECT 
【余談その1】 
これ調べてて、列のないテーブルへの 
INSERT が出来ることを初めて知るw 
test=# CREATE TABLE no_col (); 
CREATE TABLE 
test=# INSE...
選択リストなしSELECT 
【余談その2】 
選択リストなしSELECT が可なら 
列なしビューはどうなの? 
test=# d no_col 
Table "public.no_col" 
Column | Type | Modifier...
WITH ORDINALITY 
Add WITH ORDINALITY syntax to number rows returned from 
FROM-clause functions (Andrew Gierth, David Fett...
WITH ORDINALITY 
ORDINALITY 指定なし 
test=# SELECT * FROM (SELECT * FROM generate_series(1,100,20) )as 
tmp (data); data 
---...
WITH ORDINALITY 
リリースノートを見ると、 
UNNEST 関数(配列を行に展開する関数)と 
組み合わせるといいんじゃね的なこと書いてある。 
test=# SELECT * FROM unnest(ARRAY[10, 200...
ROWS FROM() 
Add ROWS FROM() syntax to allow horizontal concatenation of 
set-returning functions in the FROM-clause (Andr...
ROWS FROM() 
全く関連のないレコードを横に連結させる例。 
ラーメンテーブルは3 行、猫テーブルは4 行 
足りない行の値にはnull がセットされる。 
test=# pset null (null) 
Null display ...
ということで、微妙な? 
SELECT 文の3 つの改善を 
紹介しました。 
で、PostgreSQL 9.4.0 は 
いつリリースなんだろう。 
( まだRC も出てないけど)
おしまい
Upcoming SlideShare
Loading in …5
×

Pgunconf pg94-select小ネタ

PostgreSQL 9.4で追加されたSELECTの微妙な機能の紹介

  • Login to see the comments

  • Be the first to like this

Pgunconf pg94-select小ネタ

  1. 1. PostgreSQL 9.4 SELECT 文の 微妙な強化 ぬこ@横浜(@nuko_yokohama)
  2. 2. 自己紹介 「ぬこ@横浜」で検索 ラーメンの食べ歩きと 無駄なPostgreSQL 拡張を考えるのが趣味 漢数字型とか、 neo4j_fdwとか ゆるい全文検索拡張とか psql上の数当てとか PostgreSQL 本 書きました。 こっちも ⇒ よろしくです。
  3. 3. 現在β2 リリース中の PostgreSQL 9.4
  4. 4. ロジカルデコーディング マテリアライズド・ビュー改善 JSONB 対応 ALTER SYSTEM 等々の改善
  5. 5. それだけでなく、地味~な 改造が各所に加わっている。 SELECT 文にもちょっとした 改造が入っています。
  6. 6. SELECT 文の3 つの改善 選択リストなしSELECT WITH ORDINALITY ROWS FROM()
  7. 7. 選択リストなしSELECT Allow SELECT with an empty target list (Tom Lane) This was added so views that select from a table with zero columns can be dumped correctly. SELECT で空の選択リストを 許容するというもの。
  8. 8. 選択リストなしSELECT PostgreSQL 9.3 まで test=# SELECT ; ERROR: syntax error at or near ";" LINE 1: SELECT ; ^ test=# ですよねー
  9. 9. 選択リストなしSELECT PostgreSQL 9.4 から test=# SELECT ; -- (1 row) test=# ファッ? というか誰得なんだこの機能
  10. 10. 選択リストなしSELECT Allow SELECT with an empty target list (Tom Lane) This was added so views that select from a table with zero columns can be dumped correctly. なんか後の文章を読むと、 列のないテーブルから 選択されたビューのダンプを 正しく行なうために組み込んだ? (自分の環境で再現できなかったけど)
  11. 11. 選択リストなしSELECT 【余談その1】 これ調べてて、列のないテーブルへの INSERT が出来ることを初めて知るw test=# CREATE TABLE no_col (); CREATE TABLE test=# INSERT INTO no_col (SELECT FROM generate_series(1,3)); INSERT 0 3 test=# SELECT FROM no_col; -- (3 rows) test=# だから何?と言われると困るけどw
  12. 12. 選択リストなしSELECT 【余談その2】 選択リストなしSELECT が可なら 列なしビューはどうなの? test=# d no_col Table "public.no_col" Column | Type | Modifiers --------+------+----------- test=# CREATE VIEW no_col_v AS SELECT * FROM no_col; ERROR: view must have at least one column test=# 列なしのビューはダメらしい・・・
  13. 13. WITH ORDINALITY Add WITH ORDINALITY syntax to number rows returned from FROM-clause functions (Andrew Gierth, David Fetter) This is particularly useful for functions like unnest(). この機能はFROM 句から 返される結果に 連番を付与するというもの
  14. 14. WITH ORDINALITY ORDINALITY 指定なし test=# SELECT * FROM (SELECT * FROM generate_series(1,100,20) )as tmp (data); data ------ 1 21 41 61 81 (5 rows) ORDINALITY 指定あり test=# SELECT * FROM (SELECT * FROM generate_series(1,100,20) WITH ORDINALITY ) as tmp (data, id); data | id ------+---- 1 | 1 21 | 2 41 | 3 61 | 4 81 | 5 (5 rows)
  15. 15. WITH ORDINALITY リリースノートを見ると、 UNNEST 関数(配列を行に展開する関数)と 組み合わせるといいんじゃね的なこと書いてある。 test=# SELECT * FROM unnest(ARRAY[10, 200, 50]); unnest -------- 10 200 50 (3 rows) test=# SELECT * FROM unnest(ARRAY[10, 200, 50]) WITH ORDINALITY; unnest | ordinality --------+------------ 10 | 1 200 | 2 50 | 3 (3 rows)
  16. 16. ROWS FROM() Add ROWS FROM() syntax to allow horizontal concatenation of set-returning functions in the FROM-clause (Andrew Gierth) 最初、良くわかんなかったけど 要するに「横UNION 」を 実現する機能かな。
  17. 17. ROWS FROM() 全く関連のないレコードを横に連結させる例。 ラーメンテーブルは3 行、猫テーブルは4 行 足りない行の値にはnull がセットされる。 test=# pset null (null) Null display (null) is "(null)". test=# SELECT * FROM ROWS FROM ( dblink('dbname=ramen','SELECT soup, ramen FROM ramen') as (s text, r text), dblink('dbname=cat','SELECT kind, description FROM cat') as (k text, d text) ) x (s, r, k, d) ; s | r | k | d --------+---------------------+--------------------------+---------- 醤油 | (醤油,旭川ラーメン) | 三毛猫 | かわいい 味噌 | (味噌,札幌ラーメン) | アメリカンショートヘアー | かわいい 塩 | (塩,函館ラーメン) | マンチカン | かわいい (null) | (null) | ミックス | かわいい (4 rows) 面白いけど、使いどころが良くわからん。 generate_series と組み合わせたりするといいのか?
  18. 18. ということで、微妙な? SELECT 文の3 つの改善を 紹介しました。 で、PostgreSQL 9.4.0 は いつリリースなんだろう。 ( まだRC も出てないけど)
  19. 19. おしまい

×