面临从多个多选列表框中构造SQL的困难

时间:2012-01-31 03:36:09

标签: oracle vb6 listbox multi-select

我有一个表单,其中有大约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,我会写不同的查询,但这是六个多选列表框,我不知道。

提前致谢。

1 个答案:

答案 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)返回5iif(1 = 2, 5, 10)返回10。 (N.B.第二和第三个参数都经常被评估,即使其中一个被忽略了。)

由于where andand and之类的内容不是有效的SQL,因此我在前一条款的and控制代码中包含了每个iif。然后,由于最终的and不是有效的SQL,我添加了一个没有实际效果的最终1 = 1子句。

(顺便说一句,抱歉,如果我的缩进方案很丑陋;自从我上次写VB6以来已经过去了十几年,所以我真的不记得VB6代码通常是如何格式化的。)