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

Oracle 面临从多个多选列表框构造SQL的困难,oracle,vb6,listbox,multi-select,Oracle,Vb6,Listbox,Multi Select,我有一个表单,其中大约有6个多选列表框。列表框由不同的表填充。我可以将列表框中的选择存储在变量中,然后在SQL查询中使用这些变量。该变量存储列表框中的选定项,如下所示: If clientList.SelCount > 0 Then For i = 0 To clientList.ListCount - 1 If clientList.Selected(i) Then If Len(criteria_cl) = 0 Then

我有一个表单,其中大约有6个多选列表框。列表框由不同的表填充。我可以将列表框中的选择存储在变量中,然后在SQL查询中使用这些变量。该变量存储列表框中的选定项,如下所示:

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查询如下所示,其中包含更多变量,这些变量称为条件_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子句包含(“”)并抛出错误

请就如何克服这一问题提供一些建议?如果只有两个或三个列表框,我会编写不同的查询,但这是六个多选列表框,我没有任何线索

提前感谢。

这里有一种方法:

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\u组合的每个子句仅当
为非空时才应包括在内
iif
是一个内置函数,包含三个参数;如果其第一个参数为
true
,则返回第二个参数;如果其第一个参数为
false
,则返回第三个参数。例如,
iif(1=1,5,10)
返回
5
,而
iif(1=2,5,10)
返回
10
。(注意:第二个和第三个参数始终都会被计算,即使其中一个参数在之后被忽略。)

由于类似于
where和
之类的内容将不是有效的SQL,因此我将每个
都包含在前面子句的
iif
控制代码中。然后,因为final
不是有效的SQL,所以我附加了一个final
1=1
子句,它没有实际效果


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

如果SQL中的那部分是空的,那么可能会重复,这将需要您稍微多做一些有条件的操作。