3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

OLEDB JETでクエリを投げると、式が複雑すぎますと怒られた

ADO.Net を使って MDBへ のクエリ実行時に「式が複雑すぎます。」という例外で怒られました。

確かに、WHERE句に相当数の条件を入れています。

例えばこんな感じ。(パラメータクエリを使ってます。詳しくは(ADO.Net)OLEDB経由でのMDBへの副問い合わせにパラメータクエリを使うとおかしくなることがある)

PARAMETERS

pCondBirthday1 Char ,

pCondBirthday2 Char ,

pCondBirthday3 Char ,

pCondPref1 Text ,

pCondPref2 Text ,

pCondPref3 Text ;

SELECT *

FROM Customer

WHERE

(

Birthday = pCondBirthday1 OR

Birthday = pCondBirthday2 OR

Birthday = pCondBirthday3 OR

[省略]

) AND (

Pref = pCondPref1 OR

Pref = pCondPref2 OR

Pref = pCondPref3 OR

[省略]

)

どうやら WHERE句に条件大量にあるとダメみたいです。具体的のどれくらいの数を超えたらNGかというのは見つかりませんでした。

で、上記SQLの場合、特に一つのフィールドに対して複数の OR 条件が大量の設定してます。

これは IN句を使うべきと同僚に言われてました。

言われてみれば、そんなのもあったなと。。今まで、副問い合わせで複数値が返るときにか使ってませんでした。。

ということで、下記のように OR 条件を IN句に置き換えたらエラーはでなくなりましたとさ。

(パラメータ定義部分は省略)

SELECT *

FROM Customer

WHERE

Birthday IN ( pCondBirthday1 ,

pCondBirthday2 ,

pCondBirthday3 ,

[省略]

)

AND

Pref IN ( pCondPref1 ,

pCondPref2 ,

pCondPref3 ,

[省略]

)

ま、結局は3流PGのSQLの知識不足ということでした。

参考:

「式が複雑すぎます」の具体的な条件