【PostgreSQL】PL/pgSQL を使わずに 1 回の SQL でループを実現する方法

スポンサードリンク


まとめ

  • WITH RECURSIVE を使う。
  • ループでない時と比べて性能が向上または劣化するかは検証していない。
  • ループの中身を UNION ALL で繋げたものと比べると、順番が異なっていたときがあった気がする(うろ覚え)。下例のループ内部分に ORDER BY をつけて制御する。

以下は、公式ページの例に解説を加えた、シンプルな例です。

“【PostgreSQL】PL/pgSQL を使わずに 1 回の SQL でループを実現する方法” の続きを読む

【PostgreSQL】interval に指定する値を動的にしたい場合の書き方

まとめ

  • CAST(1 || ' month' AS interval) というようにする。”1″ の部分を引数など、動的にできる。

実践

“【PostgreSQL】interval に指定する値を動的にしたい場合の書き方” の続きを読む

Windows7 の PostgreSQL9.4 のデータベース定義や ER 図を SchemaSpy を導入して自動生成する手順

環境

  • Windows7 Professional 32bit
  • PostgreSQL 9.4
  • JDK 8

“Windows7 の PostgreSQL9.4 のデータベース定義や ER 図を SchemaSpy を導入して自動生成する手順” の続きを読む

【Ansible】【Redmine】バージョンの高い PostgreSQL をインストールして発生した bundle エラーを解消する

ポイント

  • PostgreSQL yum postgresql といった形ではなく、をリポジトリを導入して yum postgresql96-server などとした場合に発生した。
  • 事前に bundle config することが重要だった。
  • 具体的には、bundle config build.pg --with-pg-config=/usr/pgsql-9.6/bin/pg_config を行い、次に今まで失敗していたインストールコマンド bundle install --without 'development test' --path vendor/bundle を行うことで、無事にインストールできた。

“【Ansible】【Redmine】バージョンの高い PostgreSQL をインストールして発生した bundle エラーを解消する” の続きを読む

【Ansible】PostgreSQL スーパーユーザにパスワード設定後のユーザや DB 追加操作する時のコツ

  • login_user、login_password を設定する。
  • インストール直後など、スーパーユーザにパスワードが設定されていない場合、PostgreSQL 関連モジュールでは自由に設定が可能
  • しかし、一度パスワードを設定すると、今後はそのパスワードがないと PostgreSQL への変更が行えない。
  • そこで、まだパスワードが設定されていなくても、login_user、login_password を明示的に指定することでこの問題を回避し、冪等性を保つことができる。

“【Ansible】PostgreSQL スーパーユーザにパスワード設定後のユーザや DB 追加操作する時のコツ” の続きを読む

【Ansible】【Vagrant】CentOS 7 での PostgreSQL 9.6、phpPgAdmin 環境構築メモ

を作るにあたって、情報源や、勉強になったことなどをノートしていきます♪

“【Ansible】【Vagrant】CentOS 7 での PostgreSQL 9.6、phpPgAdmin 環境構築メモ” の続きを読む

【PostgreSQL】date 型を足し引きするポイント

PostgreSQL で date 型の四則演算ポイント

  • ORACLE と異なり、ADD_MONTH や LASTDAY 関数がない。
  • interval 型があるのでこれを利用する。
  • 一旦文字列型にして必要な部分を切り出して、、、という操作はしないようにする。出来上がった SQL を見た時、意図が伝わらないため。

日付を足し引きする PostgreSQL 例

“【PostgreSQL】date 型を足し引きするポイント” の続きを読む

CentOS 7 に PostgreSQL 9.2 をインストール、設定のノート

インストール

yum -y install postgresql-devel postgresql-server

特にリポジトリの追加等は行っておりません。

次のバージョンがインストールされました。

# psql --version
psql (PostgreSQL) 9.2.15
#

初期設定

CentOS 6 では、initdb は postgresql-setup ではなく、service postgresql initdb でした。

CentOS 7 となり、サービスの起動等以外にも変更となり、この点がとくに分かり辛く、調べるのに時間を使ってしまいました><。

# 初期化
postgresql-setup initdb
# 自動起動を有効
systemctl enable postgresql.service
# 起動
systemctl start postgresql.service

設定ファイル編集 1. パスワード認証へ変更

# バックアップ
cp -a /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.org
# パスワード認証へ変更
sed -i -i 's|local   all             all                                     peer|local   all             all                                     md5|' /var/lib/pgsql/data/pg_hba.conf
sed -i -i 's|host    all             all             127.0.0.1/32            ident|host    all             all             127.0.0.1/32            md5|' /var/lib/pgsql/data/pg_hba.conf
sed -i -i 's|host    all             all             ::1/128                 ident|host    all             all             ::1/128                 md5|' /var/lib/pgsql/data/pg_hba.conf

次のように変更されました♪

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

設定ファイル編集 2. パスワード暗号化 (設定変更せず)

password_encryption (boolean)
ENCRYPTEDもしくはUNENCRYPTEDの指定なしで、CREATE USER もしくはALTER USERにてパスワードが指定されている場合、このパラメータはパスワードを暗号化するか否かを決定します。 デフォルトはon(パスワードを暗号化)です。

デフォルトでオンのため、次の修正は行いませんでした。

# バックアップ
cp -a /var/lib/pgsql/data/postgresql.conf /var/lib/pgsql/data/postgresql.conf.org
# パスワード暗号化
sed -i -e 's/#password_encryption = on/password_encryption = on/' /var/lib/pgsql/data/postgresql.conf

設定ファイル編集 3. スーパーユーザに (postgres) にパスワード設定

ヒアドキュメントを使って、シェルから実行しました。

su - postgres <<EOT
psql -U postgres
ALTER USER postgres encrypted password 'vagrant';
\q
exit
EOT

確認は、次の SQL で行うことができました。

SELECT * FROM pg_shadow;

設定変更の反映

PostgreSQL を再起動して、変更した設定を反映させています。

# 再起動して設定反映
systemctl restart postgresql.service

おわりに

次の Vagrant のテンプレート作成のために、久しぶりに PostgreSQL のインストールを行いました。

調べる中で覚えておきたいこともございましたので、Github にコードを反映させる以外にノートいたしました。

以上です。

【PostgreSQL】ログイン時にパスワードも同時に渡して認証を通すコマンドの書き方

MySQL では接続コマンドと同時にパスワードを渡してログインすることが可能です。mysql -u root -ppassword という書き方ですわね。

PostgreSQL ではどうかしら?ヘルプを見てみましても、存在しません。調べてみたところ、簡単に書ける方法がございましたので、メモいたします。

接続コマンドと同時にパスワードを渡す psql の書き方

# mysql -u root -ppassword のように 1 行で PostgreSQL にログイン
PGPASSWORD=password psql -U postgres

# おまけ。ヒアドキュメントを使って、スーパーユーザ (postgres) にパスワード設定
su - postgres <<EOT
psql -U postgres
Alter USER postgres encrypted password 'vagrant';
\q
exit
EOT

# ヒアドキュメントを使って、DB 作成
PGPASSWORD=password psql -U postgres <<EOT
CREATE USER user1 WITH NOSUPERUSER NOCREATEDB NOCREATEROLE PASSWORD 'password1';
CREATE DATABASE db1 WITH OWNER user1 ENCODING 'UTF8';
EOT

“【PostgreSQL】ログイン時にパスワードも同時に渡して認証を通すコマンドの書き方” の続きを読む

【EC-CUBE】受注 CSV 出力で商品名、届け先都道府県をひとつのセルに全部入れる SQL♪

出力したいものの仕様はこうします♪

  • 「商品名」「規格1」「規格2」,「商品名」「規格1」「規格2」…、という形で 1 回で買った受注の商品をひとつのセルに出力させたい。
  • 北海道,東京都,沖縄県…、という形で 1 回で買った受注のお届け先都道府県をひとつのセルに出力させたい。
  • 商品は小計(dtb_order.subtotal)の前に、お届け先都道府県は配送情報 ID の次に出力させる。

SQL ポイント

  • || 演算子で前後のカラムを文字列結合する。
    文字列関数と演算子
  • NULL を含む文字列を結合すると全体が NULL となる。これを防止するために COALESCE 関数を使用する。COALESCE(column, ”) とすれば column が NULL ならば空文字 ” で、空白で、置き換えられる。
    条件式

“【EC-CUBE】受注 CSV 出力で商品名、届け先都道府県をひとつのセルに全部入れる SQL♪” の続きを読む