仕事メモとか

仕事中に調べた情報とか知ったことをメモしています。
unixコマンド, vim, oracle, putty, postgresql, bash, EXCEL, python, SQL全般 など。
最近は tableau, movabletype とかも触ったりしています。
雑な読書感想とかはこちら

カテゴリ: PostgreSQL


postgresqlでoracleのminusみたいなものを探したら、あった(except)

はい、もうタイトルのままなんですが、
postgresqlでは呼び方が変わっていました。

正確にはoracleがminusで、
postgresqlとSQLserverがexceptという表記法でした。
使い方は両方一緒なので、とても簡単。

select aaa from table1
minus
select aaa from table2

これで、table1に居るなかで、table2に居る人を除外(差集合)となります。
なにかの調査の時に、割と切り出しを行うためにminusを使ったりするので(あんまり正式な調査としては良くないのですが)、
最初ないのかな? と思ったけど、あってよかった。


参考:
http://www.sql-reference.com/select/except_minus.html


ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list が出た


はい、postgreSQLを使ってる時にこのエラーが出ました。
文中に書いてある通り、

order by してるんだけど、selectにdistinctしてるんだよね、どうすんねん。
というような内容。

order by を辞めるか、distinctではなくgroup by などで明示的に絞るなどすればOKです。

または、サブクエリにして、そのあとorder byを掛ければいいのですが、
ここで地味な落とし穴。

postgreSQLはサブクエリに名前付けないとエラーになります。
oracleと同じ要領で単純に括弧で括っただけだと、今度はそっちのエラーになります。


参考:
https://codeday.me/jp/qa/20190620/1057543.html
http://workmemo.techblog.jp/archives/33958688.html


brew install postgresql で、perl.h がどうのこうのでコケる

はい、macに環境を構築しようと四苦八苦しているのですが、
postgresqlをインストールしようとすると、なんかエラーでコケます。
postgresqlのバージョンは11です。


brew install postgresql
(略)
hecking tcl.h presence... yes
checking for tcl.h... yes
checking for perl.h... no
configure: error: header file is required for Perl

Do not report this issue to Homebrew/brew or Homebrew/core!

どうも、perlでエラーになるようなんですが、原因が良くわからない。

試しに、perlを個別にインストールしてみると上手くいく。
brew install perl

とりあえず単独でperl入れられたから、postgresql上は入れないようにしたい、
と思ってい調べたら、--without-perlというのがあるも、これはバージョン9.6以降は使えない。

ということで、以下の方法で除外したら上手く行きました。

brew edit postgresql
※--with-perl 行を除外

brew install postgresql

pipenv install -d


インストール内容のセットをedit出来るんですね。


参考:
https://github.com/petere/homebrew-postgresql/issues/44
https://github.com/petere/homebrew-postgresql/issues/41
https://github.com/hhvm/homebrew-hhvm/issues/122
https://github.com/Homebrew/linuxbrew-core/pull/13036


in句の上限_oracle,PostgreSQL,mySQL比較

なんとなくイメージ的に、in句の上限って1000だっけ、って思って改めて調べたら、
DBによりました。

oracle=1000
postgreSQL=2000
mySQL=上限無し(但しSQL文字数上限に引っかかる)

更に、下の参考サイト様で書いてある方法で、PostgreSQLで2000上限を突破する方法があるようです。

select unnest(ARRAY[....複数設定]) as dat

この方法で配列を疑似的にテーブル扱いとしてぶっこんで
そのまま使えるようです。

ARRAYが配列表現。
unnestが配列→行変換。

試しに文字型、int型の両方でサンプルを作ってみました。

select unnest(ARRAY['str1','str2','str_z']) as dat
select unnest(ARRAY[1,2,3]::int[]) as dat



参考:
http://kei0310.info/?p=210
https://qiita.com/choplin/items/9d5e2ff8721fb9509bf8


1行のインサートで複数行突っ込む方法(insert into ... values)

はい、複数行のinsert文を書いていたのですが、
同じだったら1insertでいけるじゃん、ということで調べてみました。
元々はPostgreSqlでやろうと思っていたら、oracleでもmySQLでも使えるっぽい。

時代は進化したものだ。

構文は大体同じっぽく、

insert into {テーブル名} ({カラム1}, {カラム2}, ...)
values
({カラム1の内容}, {カラム2の内容}, ...)
,({カラム1の内容}, {カラム2の内容}, ...)
,({カラム1の内容}, {カラム2の内容}, ...)

2行目以降はカンマで繋げています。
これで結構な件数を入れることも可能なので、
1SQLで実行したほうがよさそうな場合はこちらの方法にしていきましょう。


参考:
https://www.dbonline.jp/mysql/insert/index3.html

↑このページのトップヘ