sql查询条件带括号的判断

oceanmeng 2009-11-16 02:33:58
下面的where条件是通过VB界面用户自行输入的(也就是用户最多可以带三个不同字段条件查询),共三个左括号、三个右括号用户可以选择有或者是无,只有在选择了字段且输入对应的字段值括号才起作用,但用户根据自己的需要输入相关值后程序自动拼出SQL的where条件来查询

界面如下:
左括号下拉框 字段名下拉框 字段值下拉框 右括号下拉框 连接下拉框
cmbbracket11 cmbField1 txtValue1 cmbbracket12 cmbAndOr1 (内容为and,or)
cmbbracket21 cmbField2 txtValue2 cmbbracket22 cmbAndOr2 (内容为and,or)
cmbbracket31 cmbField3 txtValue3 cmbbracket23


'拼出SQL的where条件:
If cmbField1.Text <> "" And Trim(txtValue1.Text) <> "" Then
Filed1 = " and " & cmbbracket11.Text & "[" & cmbField1.Text & "] = '" & Trim(txtValue1.Text) & "' " & cmbbracket12.Text
End If
If cmbField2.Text <> "" And Trim(txtValue2.Text) <> "" Then
Filed2 = " " & cmbAndOr1.Text & " " & cmbbracket21.Text & "[" & cmbField2.Text & "] = '" & Trim(txtValue2.Text) & "' " & cmbbracket22.Text
End If
If cmbField3.Text <> "" And Trim(txtValue3.Text) <> "" Then
Filed3 = " " & cmbAndOr2.Text & " " & cmbbracket31.Text & "[" & cmbField3.Text & "] = '" & Trim(txtValue3.Text) & "' " & cmbbracket32.Text
End If
If Filed1 <> "" Or Filed2 <> "" Or Filed3 <> "" Then
FiledTotal = " and (1=1 " & Filed1 & Filed2 & Filed3 & ")"
End If


但目前我在判断括号成对性问题难住了我,也就是用户选择左括号,那必须后面有一个右括号;若选择了右括号,那前面必须有一个左括号。但后面或前面可能隔了一个查询字段,也就是一个字段就组成一对括号,这是最简单的方式,但查询条件有or、and的情况下,可能两个字段条件或三个字段条件组成一对括号,这样就需要程序判断客户是否选择好了成对的括号,若匹配不对,拼出来的sql语句就不合法,会导致报错。

各位,下面的用户选择括号合法性判断程序我只会搞一个字段组成一对括号的情况,两个字段条件或三个字段条件组成一对括号的判断难住了我,该如何判断?

If (cmbField1.Text <> "" And Trim(txtValue1.Text) <> "" And cmbbracket11.Text <> "" And cmbbracket12.Text = "") Or (cmbField1.Text <> "" And Trim(txtValue1.Text) <> "" And cmbbracket11.Text = "" And cmbbracket12.Text <> "") Then
MsgBox "左右括号必须成对出现!", vbExclamation, "Warning Info"
If cmbbracket11.Text = "" Then cmbbracket11.SetFocus
If cmbbracket12.Text = "" Then cmbbracket12.SetFocus
Exit Sub
End If
If (cmbField2.Text <> "" And Trim(txtValue2.Text) <> "" And cmbbracket21.Text <> "" And cmbbracket22.Text = "") Or (cmbField2.Text <> "" And Trim(txtValue2.Text) <> "" And cmbbracket21.Text = "" And cmbbracket22.Text <> "") Then
MsgBox "左右括号必须成对出现!", vbExclamation, "Warning Info"
If cmbbracket21.Text = "" Then cmbbracket21.SetFocus
If cmbbracket22.Text = "" Then cmbbracket22.SetFocus
Exit Sub
End If
If (cmbField3.Text <> "" And Trim(txtValue3.Text) <> "" And cmbbracket31.Text <> "" And cmbbracket32.Text = "") Or (cmbField3.Text <> "" And Trim(txtValue3.Text) <> "" And cmbbracket31.Text = "" And cmbbracket32.Text <> "") Then
MsgBox "左右括号必须成对出现!", vbExclamation, "Warning Info"
If cmbbracket31.Text = "" Then cmbbracket31.SetFocus
If cmbbracket32.Text = "" Then cmbbracket32.SetFocus
Exit Sub
End If
...全文
1226 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2009-11-17
  • 打赏
  • 举报
回复
在没有“选择了字段且输入对应的字段值”时清除该行的括号,然后用我的判断
windyhero1983 2009-11-17
  • 打赏
  • 举报
回复
…………海洋同学,为什么非要把所有的东西都扔在一起判断呢,分开来,如果tiger的判断通过了,那你再进行判断是否存在你说的情况就好了,一个循环里放太多东西,一是影响运算速度,二是将来如果想维护的话也容易出错的。
cBirdNO1NO1 2009-11-17
  • 打赏
  • 举报
回复
只需三个下拉框:字段、连接符、字段值。
1、首先,只有字段下拉框可操作
2、用户选择字段后,该下拉框禁用,连接符下拉框设置为可用
3、用户选择连接符后,该下拉框禁用,字段值下拉框设置为可用
4、用户选择字段值后,禁用该下拉框,字段下拉框设置为可用。代码生成一个条件项(用括号界定)
5、新条件项与原有条件项合并。转1
oceanmeng 2009-11-17
  • 打赏
  • 举报
回复
只有在选择了字段且输入对应的字段值那么他的前后括号才起作用,也就是我下面的程序。按上面Tiger_Zhao的判断程序,当用户在第一个字段前打上左括号,且第一个字段有值(第一个字段前打上左括号会拼入sql中),但在第二个没有设置值的字段后面打上右括号,这样右括号将不会拼入sql中,程序就报sql语法错误。那么这种情况该如何判断,也就是程序要提示用户在第一个字段后面打上右括号,打在后面空值字段的括号都视为作废。

'拼出SQL的where条件:
If cmbField1.Text <> "" And Trim(txtValue1.Text) <> "" Then
Filed1 = " and " & cmbbracket11.Text & "[" & cmbField1.Text & "] = '" & Trim(txtValue1.Text) & "' " & cmbbracket12.Text
End If
If cmbField2.Text <> "" And Trim(txtValue2.Text) <> "" Then
Filed2 = " " & cmbAndOr1.Text & " " & cmbbracket21.Text & "[" & cmbField2.Text & "] = '" & Trim(txtValue2.Text) & "' " & cmbbracket22.Text
End If
If cmbField3.Text <> "" And Trim(txtValue3.Text) <> "" Then
Filed3 = " " & cmbAndOr2.Text & " " & cmbbracket31.Text & "[" & cmbField3.Text & "] = '" & Trim(txtValue3.Text) & "' " & cmbbracket32.Text
End If
If Filed1 <> "" Or Filed2 <> "" Or Filed3 <> "" Then
FiledTotal = " and (1=1 " & Filed1 & Filed2 & Filed3 & ")"
End If

Tiger_Zhao 2009-11-16
  • 打赏
  • 举报
回复
Function CheckBracket(ParamArray bracket()) As Boolean
Dim iBarcket As Long
Dim cbo As ComboBox
Dim i As Long

For i = 0 To UBound(bracket)
Set cbo = bracket(i)
Select Case cbo.Text
Case "("
iBarcket = iBarcket + 1
Case ")"
iBarcket = iBarcket - 1
If iBarcket < 0 Then
MsgBox "不能先出现右括号!", vbExclamation, "Warning Info"
cbo.SetFocus
Exit Function
End If
End Select
Next

If iBarcket <> 0 Then
MsgBox "左右括号必须成对出现!", vbExclamation, "Warning Info"
Exit Function
End If

CheckBoxConstants = True
End Function

'调用
If Not CheckBracket(cmbbracket11, cmbbracket12, _
cmbbracket21, cmbbracket22, _
cmbbracket31, cmbbracket32) Then
Exit Sub
End If
windyhero1983 2009-11-16
  • 打赏
  • 举报
回复
那判断起来比较麻烦,简单一点就是:三个左括号的text是“(”的和与三个右括号的text是“)”的和相同,呵呵。
但如果需要每个“(”都要直接对应一个“)”而不允许存在“(())”这样情况的话,就需要每一个左括号都要做一次判断了,例如:假设第一个左括号存在而第一行右括号不存在,那么如果第二行左括号存在即为错,依此类推,但注意要每一个都递推下去,最好是做一个简单的for循环,否则写出来会很多,呵呵
oceanmeng 2009-11-16
  • 打赏
  • 举报
回复
右括号自动添加,可能添加在该字段值的后面,也可能在第二个字段后面,或者第三个字段后面,那怎么办?
windyhero1983 2009-11-16
  • 打赏
  • 举报
回复
如果只是同行的括号判断,最简单的方法就是不要让他判断,设置个combo_click事件,选择左括号时,右括号自动添加就好了,程序并不一定要都有检查才好,最高效的实现才是对的。^-^

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧