ページの先頭行へ戻る
Symfoware Server V10.0.0 アプリケーション開発ガイド(共通編)

9.2.1 2つの値を比較する

2つの値を比較するには、比較述語またはNULL述語を使用します。

比較演算子を用いて比較する

2つの値を比較するには比較述語を使用します。比較述語で指定する比較演算子を以下に示します。

表9.4 比較演算子

比較演算子

(注)

“=”の左側の値式と右側の値式が等しい場合に真となり、等しくない場合に偽となります。

“<”の左側の値式が右側の値式より小さい場合に真となり、大きいまたは等しい場合に偽となります。

<=

“<=”の左側の値式が右側の値式より小さいまたは等しい場合に真となり、大きい場合に偽となります。

“>”の左側の値式が右側の値式より大きい場合に真となり、小さいまたは等しい場合に偽となります。

>=

“>=”の左側の値式が右側の値式より大きいまたは等しい場合に真となり、小さい場合に偽となります。

<>

“<>”の左側の値式と右側の値式が等しくない場合に真となり、等しい場合に述語は偽となります。

注) 比較演算子の左側または右側の値式がNULL値の場合、比較述語の結果は不定になります。


比較演算子の左右の値式の対は、比較可能であることが必要です。比較可能なデータ型を以下に示します。

参照

なお、各データ型については、“SQLリファレンス”を参照してください。

表9.5 比較可能なデータ型

  

右辺

文字列型

各国語文字列型

真数型・概数型

DATE型

TIME型

TIMESTAMP型

INTERVAL型(年月)

INTERVAL型(日時)

左辺

文字列型

×

×

○(注1)

○(注2)

○(注3)

○(注4)

○(注5)

各国語文字列型

×

×

×

×

×

×

×

真数型・概数型

×

×

×

×

×

○(注6)

○(注7)

DATE型

○(注1)

×

×

×

×

×

×

TIME型

○(注2)

×

×

×

×

×

×

TIMESTAMP型

○(注3)

×

×

×

×

×

×

INTERVAL型(年月)

○(注4)

×

○(注6)

×

×

×

×

INTERVAL型(日時)

○(注5)

×

○(注7)

×

×

×

×

○:比較可能

×:比較不可

注1) 比較相手が変数指定の場合のみ可能です。このとき変数の内容は日付列であることが必要です。

注2) 比較相手が変数指定の場合のみ可能です。このとき変数の内容は時刻列であることが必要です。

注3) 比較相手が変数指定の場合のみ可能です。このとき変数の内容は時刻印列であることが必要です。

注4) 比較相手が変数指定の場合のみ可能です。このとき変数の内容は比較元と同じ精度を持つ年月クラスの時間隔定数であることが必要です。

注5) 比較相手が変数指定の場合のみ可能です。このとき変数の内容は比較元と同じ精度を持つ日時クラスの時間隔定数であることが必要です。

注6) 比較相手が真数(位取り0)の変数指定の場合のみ可能です。このとき変数の内容は比較元と同じ単一日時フィールドからなる年月クラスの時間隔定数であることが必要です。

注7) 比較相手が真数(位取り0)の変数指定の場合のみ可能です。このとき変数の内容は比較元と同じ単一日時フィールドからなる日時クラスの時間隔定数であることが必要です。


比較述語の指定例を以下に示します。

1

在庫表から製品番号が123の行を取り出します。

SELECT  …  FROM  在庫管理.在庫表

            WHERE  製品番号  =  123
                     (1)    (2) (3)

(1) 値式

(2) 比較演算子

(3) 値式

(1)~(3) 比較述語


2

在庫表から在庫数量が50未満の行を取り出します。

SELECT  …  FROM 在庫管理.在庫表 WHERE 在庫数量 < 50

3

発注表から“仕入価格×発注数量”が100万以下の行を取り出します。

SELECT  …  FROM 在庫管理.発注表

            WHERE 仕入価格 * 発注数量 <= 1000000

4

在庫表から在庫数量が500より大きい行を取り出します。

SELECT  …  FROM 在庫管理.在庫表 WHERE 在庫数量 > 500

5

在庫表から在庫数量が500以上の行を取り出します。

SELECT  …  FROM 在庫管理.在庫表 WHERE 在庫数量 >= 500

6

在庫表から“テレビ”以外の製品名の行を取り出します。

SELECT  …  FROM 在庫管理.在庫表 WHERE 製品名 <> N'テレビ'

論理演算子を使用して、複数の比較述語を組み合わせて指定する例を以下に示します。


7

在庫表から製品名が“テレビ”で、かつ在庫数量が90以上の行を取り出します。

SELECT  …  FROM 在庫管理.在庫表

            WHERE 製品名 = N'テレビ' AND 在庫数量 >= 90

8

在庫表から在庫数量が10以上で製品名がビデオ、または在庫数量が200以上で製品名がテレビの行を取り出します。

SELECT  …  FROM 在庫管理.在庫表

            WHERE 在庫数量 >= 10 AND 製品名 = N'ビデオ' OR

                  在庫数量 >= 200 AND 製品名 = N'テレビ'

9

在庫表から“テレビ”または“ビデオ”以外の製品名の行を取り出します。

SELECT  …  FROM 在庫管理.在庫表

            WHERE NOT 製品名 = N'テレビ' AND

                  NOT 製品名 = N'ビデオ'
副問合せを用いた比較述語

探索条件中の比較述語に指定する値が、関数によって導き出される値であるような場合に、探索条件の中に副問合せを記述することができます。

副問合せの括弧の中は問合せ指定と同じ形式です。ただし、副問合せの場合、導出される表は、列数が1つであることが必要です。したがって、探索条件の左辺には1個の値式(列名、関数など)を指定することを意味しています。副問合せを用いた比較述語の例を以下に示します。

例10

発注表から仕入価格の平均をとり、それよりも高い仕入価格の取引先を発注表から取り出します。

SELECT  取引先  FROM  在庫管理.発注表

   WHERE  仕入価格  >  (SELECT AVG(仕入価格) FROM 在庫管理.発注表)
            (1)    (2)         ^^^^^^^^^^^^^ (3)
                                    ↓
                                 列数は1つ

(1) 値式(1個)

(2) 比較演算子

(3) 副問合せ

(1)~(3) 比較述語

図9.10 副問合せを用いた比較述語を指定してデータを検索する例

注) AVG(仕入価格)の結果から作成される列です。

備考. 集合関数の結果の列には名前がありません。


例11

在庫表から製品番号の最大値をとり、その値の取引製品の行を発注表から削除します。

DELETE FROM 在庫管理.発注表

         WHERE 取引製品 = (SELECT MAX(製品番号) FROM 在庫管理.在庫表)

図9.11 副問合せを用いた比較述語を指定してデータを削除する例

注) MAX(製品番号)の結果から作成される列です。

備考. 集合関数の結果の列には名前がありません。

NULL値かどうかを調べる

列の値がNULL値かどうかを調べるにはNULL述語を使用します。指定例を以下に示します。

12

在庫表から倉庫番号がNULL値の行を取り出します。

SELECT  …  FROM 在庫管理.在庫表

            WHERE 倉庫番号  IS  NULL
                    (1)          (A)

(1) 列名

(1)~(A) NULL述語


13

在庫表から倉庫番号がNULL値でない行を取り出します。

SELECT  …  FROM 在庫管理.在庫表

            WHERE 倉庫番号  IS  NOT NULL
                            (1)

(1) NULL述語