カテゴリー別アーカイブ: PostgreSQL

右辺にNULL値が存在したらIN述語がうまくうごかない

NOT INを使おうとしても右辺に不定(NULL値)が存在するとうまく動きません。EXISTSならうまく動いたりします。なぜならばEXISTS述語はANY,ALL限定述語と違い、右辺に不定(NULL値など)があったとしても行を返すか否かにより判定を行うことができるからです。
9.16.1. EXISTS
EXISTS (subquery)
EXISTSの引数は、任意のSELECT文または副問い合わせです。副問い合わせはそれが何らかの行を返すか否かの決定のために評価されます。もし1つでも行を返すのであれば、EXISTSの結果は”真”となり、副問い合わせが行を返さない場合、EXISTSの結果は”偽”となります。
9.16.5. ALL
expression operator ALL (subquery)右辺は括弧で括られた副問い合わせで、正確に1つの列を返さなければなりません。左辺の式は副問い合わせの結果行それぞれに対して、指定されたoperatorを使用して評価、比較されます。なお、operatorは結果として論理値を生成する必要があります。(副問い合わせが行を返さない特別な場合を含む)全ての行が真になる場合、ALLの結果は”真”です。1つでも偽の結果があると、結果は”偽”です。比較がすべての行で偽を返さず、かつ、少なくとも1つの行でNULLを返した場合、結果はNULLとなります。
NOT INは<> ALLと等価です。
http://www.postgresql.jp/document/current/html/functions-subquery.html

PostgreSQLにおける列とかの名前規則とかとか

PostgreSQLは大文字と小文字を認識できるっぽい。
今まですべてのデータベースが列名などは全部小文字に変換してやるって思ってた(恐らくそれはOracleでどこかのHPで見たのだろう)。
大文字とか(特殊な文字)で列名などを指定する場合にはダブルクォートで囲めばいいっぽい。
つまり下記の二行は意味が違うってこった。
ALTER TABLE tbl1 ADD COLUMN pk integer;
ALTER TABLE tbl1 ADD COLUMN “PK” integer;