SQLで否定条件を書く方法

はじめに
開発中のRailsアプリケーションでは、postgresqlを使っている。
仕事で最近、pentahoというETLの作成ツールを使う機会があった。
SQL文を直接書くことはない。
しかし、データベースを扱っているので、SQLの学習をしてみようと思った。
ProgateのSQLを学習をしていて、NOT演算子の書き方を覚えていないことに気がついた。
なので、その書き方についての記事を書いていく。
せっかくなので、現在作成中のRailsアプリケーションで使用しているPostgreSQLで試してみたいと思う。
結論
where NOT(条件)と書く。
以下の例の場合は、select * from posts where NOT(content = ‘ジャンカラ’); というSQL文。
postsテーブルから全てのデータを選択している。条件は、contentカラムが「ジャンカラ」ではないこと。

NOTの後の()は無くても、同じ結果が得られる。

データベースにアクセス
まずは、PostgreSQLデータベースに接続して、テーブルの中身を確認する方法を参考にして、データベースにアクセスしよう。
テスト環境のデータベースにアクセスして、postsテーブルから全てのレコードを取り出すことが出来た。

否定条件を書く方法
WHEREの後に、NOTと条件を書くといいらしい。

試行錯誤
色々とやってみたが、上手くいかなかった。
select where not content = “ジャンカラ”だと、どのテーブルかが分からないからダメ。

from postsでテーブル名を指定すると、from付近で文法エラーがあると注意された。

select from posts where not content = “ジャンカラ”だと、ジャンカラをカラム名と見なされてしまった。

別の参考記事を見てみる
先程の参考記事では、WHEREから始まっているため、その前後が書いてある参考記事を探していこう。
ポテパンスタイルの記事が参考になった。

select * from テーブル名 where NOT (条件); でいけそうだ。
もう一度チャレンジ
先程の方法で上手くいかなかった。どうやら、ダブルクオテーションが使えないらしい。

シングルクオテーションにしたら、上手く行った。

別のやり方で、selectの後に全てを表す「*」を付けない場合は、1つの行という表示だけがされた。

コメントを残す