我有一个表单,其中有大约6个多选列表框。 listBox从不同的表中填充。将listBox中的选择存储在变量中然后在SQL查询中使用变量我没有问题。变量存储listBox中的选定项目,如下所示:
If clientList.SelCount > 0 Then
For i = 0 To clientList.ListCount - 1
If clientList.Selected(i) Then
If Len(criteria_cl) = 0 Then
criteria_cl = Chr(39) & clientList.List(i) & Chr(39)
Else
criteria_cl = criteria_cl & "," & Chr(39) & clientList.List(i) & Chr(39)
End If
End If
Next
Else
End If
SQL查询如下所示,其中包含更多名为criteria_xx
的变量 strsql = "select * from pmt_hist_dmart_step2 where dbr_portfolio in (" & criteria_pf & ") and DBR_CLIENT in (" & criteria_cl & _
") and DBR_ACCT_TYPE in (" & criteria_ac & ")..... ;"
当用户不做选择时,我该如何处理这种情况。目前,criteria_xx变量变为空白,IN子句包含('')并抛出错误。
请提供一些有关如何克服这个问题的建议?如果它只有两个或三个listBox,我会写不同的查询,但这是六个多选列表框,我不知道。
提前致谢。
答案 0 :(得分:2)
这是一种方法:
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代码通常是如何格式化的。)