Вот один из подходов:
strsql = " select * " & _
" from pmt_hist_dmart_step2 " & _
" where " & iif(len(criteria_pf) = 0, _
"", _
"dbr_portfolio in (" & criteria_pf & ") and " _
) & _
iif(len(criteria_cl) = 0, _
"", _
"DBR_CLIENT in (" & criteria_cl & ") and " _
) & _
iif(len(criteria_ac) = 0, _
"", _
"DBR_ACCT_TYPE in (" & criteria_ac & ") and " _
) & _
... & _
" 1 = 1;"
Идея заключается в том, что каждое предложение формы dbr_portfolio in (...)
должно быть включено только в том случае, если ...
не является пустым. iif
- это встроенная функция, которая принимает три аргумента; если его первый аргумент true
, то он возвращает второй аргумент, а если его первый аргумент false
, то он возвращает третий аргумент. Например, iif(1 = 1, 5, 10)
возвращает 5
, а iif(1 = 2, 5, 10)
возвращает 10
. (N.B. Второй и третий аргументы всегда оцениваются, хотя один из них впоследствии игнорируется.)
Поскольку что-то вроде where and
или and and
не может быть допустимым SQL, я включаю каждый and
в iif
-контролируемый код предыдущего предложения. Затем, поскольку окончательный and
не будет действительным SQL, я добавил окончательное предложение 1 = 1
, которое не имеет действительного эффекта.
(Кстати, извините, если моя схема отступов уродлива; с тех пор, как я в последний раз писал VB6, прошло более десятка лет, поэтому я действительно не помню, как обычно форматируется код VB6.)