投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/8/10 16:45:38
SQL 文を動的に生成すると、そのたびに構文解析されてオプティマイザーの効率が落ちるので、
よく使われる画面なのであれば、問い合わせが大文字小文字も含めて常に同一となるようにし、
条件値は MySqlParameter オブジェクト経由で渡すようにしてみては如何でしょう。


【案1】
WHERE ( ORDER_DATE    BETWEEN @ORDER_DATE_FROM AND @ORDER_DATE_TO )
  AND ( ORDER_NUMBER  BETWEEN @ORDER_NUM_FROM  AND @ORDER_NUM_TO  )
  AND ( SUB_TOTAL     BETWEEN @SUB_TOTAL_FROM  AND @SUB_TOTAL_TO  )

という SQL 条件にしておき、

cmd.Parameter("ORDER_NUM_FROM").Value = If(txtOrderNumFrom.TextLength = 0, Integer.MinValue, CInt(txtOrderNumFrom.Text))
cmd.Parameter("ORDER_NUM_TO"  ).Value = If(txtOrderNumTo.TextLength   = 0, Integer.MinValue, CInt(txtOrderNumTo.Text  ))

のように、各フィールドの最大・最小値を指定する。



【案2】
WHERE ( @USE_ORDER_DATE_FROM = 0  OR  ORDER_DATE >= @ORDER_DATE_FROM)
  AND ( @USE_ORDER_DATE_TO   = 0  OR  ORDER_DATE <= @ORDER_DATE_TO  )
  AND ( @USE_ORDER_NUM_FROM  = 0  OR  ORDER_NUM  >= @ORDER_NUM_FROM )
  AND ( @USE_ORDER_NUM_TO    = 0  OR  ORDER_NUM  <= @ORDER_NUM_TO   )
  AND ( @USE_OSUB_TOTAL_FROM = 0  OR  SUB_TOTAL  >= @SUB_TOTAL_FROM )
  AND ( @USE_SUB_TOTAL_TO    = 0  OR  SUB_TOTAL  <= @SUB_TOTAL_TO   )

という SQL 条件にしておき、

If txtOrderNumFrom.TextLength = 0 Then
    cmd.Parameter("USE_ORDER_NUM_FROM").Value = 0
    cmd.Parameter(    "ORDER_NUM_FROM").Value = DBNull.Value
Else
    cmd.Parameter("USE_ORDER_NUM_FROM").Value = 1
    cmd.Parameter(    "ORDER_NUM_FROM").Value = CInt(txtOrderNumFrom.Text)
End If
If txtOrderNumTo.TextLength = 0 Then
    cmd.Parameter("USE_ORDER_NUM_TO").Value = 0
    cmd.Parameter(    "ORDER_NUM_TO").Value = DBNull.Value
Else
    cmd.Parameter("USE_ORDER_NUM_TO").Value = 1
    cmd.Parameter(    "ORDER_NUM_TO").Value = CInt(txtOrderNumTO.Text)
End If

のように指定する。

※上記では、注文番号(ORDER_NUM)列が INT 型のフィールドであると想定しています。
※TextBox に非数値が入力されていた場合のチェックは省略しています。
※注文日、小計などの条件も同様に記述します。