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の知識不足ということでした。
参考: