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

3.5.2 SQL文の条件式には明示的に条件を記述する

SQL文の中の条件の記述時には、明示的に条件を記述することが重要です。例えば、次の2つの条件を比較してください。

CNF形式 :C1=10 AND (C2=20 OR C2=30)

DNF形式 :(C1=10 AND C2=20)OR(C1=10 AND C2=30)

CNF形式(Conjunctive Normal Form)とは、いくつかの条件のかたまりを最終的にはANDで結合している形式です。DNF形式(Disconjunctive Normal Form)とは、いくつかの条件のかたまりを最終的にはORで結合している形式です。2つを見比べると、C1=10という条件が、全体に対して有効であることが、CNF形式の場合は明確ですが、DNFの場合はあまり明確ではありません。2つの条件、(C1=10 AND C2=20)、(C1=10 AND C2=30)の中を見比べて、C1=10という条件が両方に含まれていることに気がついてはじめて、C1=10という条件が全体に有効であることがわかります。

以下に、条件を記述する際の主な注意点を説明します。

ポイント

内容

CNF形式で記述する

AND演算子やOR演算子を複雑に絡めた条件を記述しないこと。記述は、単純なCNF形式で記述し、DNF形式は多用しないこと。

【例】
[良い例] CNF形式 :C1=10 AND (C2=20 OR C2=30)

[悪い例] DNF形式 :(C1=10 AND C2=20)OR(C1=10 AND C2=30)

IN述語で記述する

ある項目がいずれかの値と一致するかの条件は、OR演算子で結合するのではなく、IN述語を使用すること。

【例】
[良い例] IN述語 :C1 IN(10, 20, 30, 40)

[悪い例] OR演算子:C1=10 OR C1=20 OR C1=30 OR C1=40

ジョイン条件は列同士の=条件にする(演算式にしない)

ジョイン条件は項目同士を使用し、演算式や関数、CASTなどを使用しない。

【例】
[良い例] 項目同士 :T1.C1=T2.C1

[悪い例] 関数 :T1.C1=SUBSTRING(T2.C1 FROM 1 FOR 3)

[悪い例] CAST :T1.C1=CAST(T2.C1 AS CHAR(10))

不要な条件を書かない

【例】
WHERE C1 BETWEEN :VAL1 AND :VAL2

AND C2 BETWEEN :VAL3 AND :VAL4

汎用的なアクセスルーチンなどを作成した時、ほとんどのケースはC1のみで絞り込む(C2の:VAL3、:VAL4には最小値と最大値を指定)、ごくまれにC2の値も指定するようなケースでは、C2の条件を指定しないSQLとC2の条件も指定したSQLに分ける

=で指定できるものはBETWEENで汎用的に作らない

事実上イコール条件しか指定しない(検索画面の値を指定する箱が1個など)が、将来を見越してBETWEENで指定するようなことをしない