|
分類:[.NET 全般]
ひろしと申します。
データベースはOracle 11.2.0.2.0 を使用しています。
ID CHAR(10) (PKEY) NAME VARCHAR(20)
上記のようなテーブルがあったとします。
画面から ID の指定があった場合は、ID 条件を指定して、指定がない場合は全件取得という仕様があります。 (言語はVBです)
そこで、プログラム的には、IF文で分岐すると、SQLエディタのSQLをそのまま貼り付ける事が出来なくなってしまうため
select * from emp where id > :id_From or :id_From is null
というSQLで分岐なしにしようと考えたのですが、実行計画を見てみると、プライマリーキーで検索しているのにもかかわらず TABLE ACCESS FULL になってしまいます。
VBのIf文で分岐することなく、インデックスが使われるSQLの書き方はあるでしょうか。
If分で分岐すると以下のようになると思います。 sb.AppendLine("select * from emp") if Not String.IsNullOrEmpty(id_From) Then sb.AppendLine("where id > :id_From") End If
分岐なしにすると以下のようになり、エディタのSQLをそのまま貼り付けることが出来ます。 sb.AppendLine("select * from emp") sb.AppendLine("where id > :id or :id is null")
よろしくお願いします。
※質問用にSQLをシンプルにしていますが、実際にはもっと複雑なSQLとなります。
|