PostgreSQL | PostgreSQL 基本構文 | 比較演算子を使用する(<, >, =, BETWEEN, IS NULL)

比較演算子は 2 つの値を比較し、大きいか小さいか、等しいか異なるかなどを判定する。ここでは、比較演算子の使い方について説明する。

大小や等価を比較する

比較演算子は左辺と右辺を比較し、結果として boolean 型の値を返す。

大小を比較する比較演算子として、<<=>>= の 4 つが用意されている。

<    左辺は右辺より小さい
>    左辺は右辺より大きい
<=   左辺は右辺以下である
>=   左辺は右辺以上である

等しいかどうかを比較する演算子として、=<>!= の 3 つが用意されている。

=    左辺と右辺は等しい
<>   左辺と右辺は等しくない
!=   左辺と右辺は等しくない

実際に試してみる。次のようなテストテーブルを作成する。

mydb=# create table customer(name varchar(10),  old integer);
CREATE TABLE
mydb=#

次のようなデータをテーブルに追加する。

mydb=# insert into customer values  ( 'kimkc', 41),  ( 'devkuma', 20),  ( 'yunho', 32),  ( 'yongtea', 34),  ( 'jiwoo', 12);
INSERT 0 5
mydb=#

そして SELECT コマンドを使用し、old カラムの値が 20 より大きいか小さいか、または等しいかを確認する。

mydb=# select name, old,
mydb-#   old <20 as "20未満",
mydb-#   old > 20 as "20より大きい",
mydb-#   old = 20 as "20と等しい"
mydb-# from customer;
  name   | old | 20未満 | 20より大きい | 20と等しい
---------+-----+--------+--------------+-----------
 kimkc   |  41 | f      | t            | f
 devkuma |  20 | f      | f            | t
 yunho   |  32 | f      | t            | f
 yongtea |  34 | f      | t            | f
 jiwoo   |  12 | t      | f            | f
(5 行)

比較演算子を使用して、カラムに保存されている値を評価した結果を取得できた。

範囲内にあるかを比較する (BETWEEN)

BETWEEN 条件は、比較対象の値が指定された範囲内にあるかどうかを比較し、結果として boolean 型の値を返す。

a BETWEEN x AND y       x 以上 y 以下の範囲にある
a NOT BETWEEN x AND y   x 以上 y 以下の範囲にない

比較対象の値 ax 以上かつ y 以下であれば TRUE である。NOT がある場合は、x 以上かつ y 以下ではない場合に TRUE である。

BETWEEN 条件は、比較演算子と論理演算子を使用して次のように書くことができる。次の 2 つの式は同じ意味である。

a >= x AND a <= y
a BETWEEN x AND y

また、NOT BETWEEN 条件も比較演算子と論理演算子を使用して次のように書くことができる。次の 2 つの式は同じ意味である。

a < x OR a > y
a NOT BETWEEN x AND y

a BETWEEN x AND y のように指定した場合に xy より大きい値であれば、x 以上 y 以下の値は存在しないため常に FALSE である。SYMMETRIC を指定すると、xy の値を並べ替え、小さい値から大きい値までの範囲内にあるかを判定する。

a BETWEEN SYMMETRIC x AND y
a NOT BETWEEN SYMMETRIC x AND y

比較対象の値 ax または y の小さい値から大きい値までの範囲内にあれば TRUE である。NOT がある場合はその逆になる。

実際に試してみる。前に作成した customer テーブルについて、old カラムの値が 15 から 33 の範囲内にあるか確認する。

mydb=# select name, old,
mydb-#   old between 15 and 33 as "15以上33以下"
mydb-# from customer;
  name   | old | 15以上33以下
---------+-----+-------------
 kimkc   |  41 | f
 devkuma |  20 | t
 yunho   |  32 | t
 yongtea |  34 | f
 jiwoo   |  12 | f
(5 行)

指定した範囲内にある場合は TRUE、そうでない場合は FALSE になった。

次に、BETWEEN 条件の範囲を表す数値を変えてみる。

mydb=# select name, old,
mydb-#   old between 33 and 15 as "33以上15以下"
mydb-# from customer;
  name   | old | 33以上15以下
---------+-----+-------------
 kimkc   |  41 | f
 devkuma |  20 | f
 yunho   |  32 | f
 yongtea |  34 | f
 jiwoo   |  12 | f
(5 行)

33 以上 15 以下の範囲は存在しないため、すべて FALSE になった。

ここで SYMMETRIC を指定すると、範囲を指定した 2 つの値を並べ替えて範囲指定が正しく判定される。

mydb=# select name, old,
mydb-#   old between symmetric 33 and 15 as "15以上33以下"
mydb-# from customer;
  name   | old | 15以上33以下
---------+-----+-------------
 kimkc   |  41 | f
 devkuma |  20 | t
 yunho   |  32 | t
 yongtea |  34 | f
 jiwoo   |  12 | f
(5 行)

15 と 33 の小さい値から大きい値までの範囲内にあれば TRUE、そうでなければ FALSE になる。

値が NULL かを比較する (IS NULL, IS NOT NULL)

IS NULL は比較対象の値が NULL かどうかを比較し、結果として boolean 型の値を返す。

expression IS NULL       expression が NULL である
expression IS NOT NULL   expression が NULL ではない

比較対象の値が NULL であれば TRUE である。NOT がある場合は、NULL ではなければ TRUE である。値が NULL かどうかを確認するときに比較演算子 = で比較しても、正しい結果は得られない。

また、非標準構文として、次の条件も同じ結果になる。

expression ISNULL       expression が NULL である
expression NOTNULL      expression が NULL ではない

実際に試してみる。次のようなテストテーブルを作成する。

mydb=# create table friends(name varchar(10), old integer);
CREATE TABLE
mydb=#

次のようなデータをテーブルに追加する。

mydb=# insert into friends values ('kimkc', 39), ('devkuma', NULL), (NULL, 19);
INSERT 0 3
mydb=# \pset null 'NULL'
NULL 値は "NULL" 文字として表示されます。
mydb=# select * from friends;
  name   | old
---------+------
 kimkc   |   39
 devkuma | NULL
 NULL    |   19
(3 行)

通常、NULL を取得して表示すると何も表示されないため、NULL の場合に NULL と表示されるよう設定している。

それでは SELECT コマンドを使用し、name カラムおよび old カラムに保存されている値が NULL かどうかを判定してみる。

mydb=# select name, name is null as "NULL?", old, old is null as "NULL?" from friends;
  name   | NULL? | old  | NULL?
---------+-------+------+-------
 kimkc   | f     |   39 | f
 devkuma | f     | NULL | t
 NULL    | t     |   19 | f
(3 行)

カラムに保存されている値が NULL であれば TRUE、そうでなければ FALSE になった。

ここまで、PostgreSQL で提供される比較演算子の使い方について説明した。