客户需要一个查询功能,通过对几个字段条件进行查询,遇到的问题是
有a,b,c,d,e,f等字段,每个字段可以选择多种查询筛选,比如a>50 a<100 a<>140 a>200 a not in (55,67,89)等,这些关系可以进行与或选择。
如何确定优先关系,因为与或的先后顺序会有影响的。
有a,b,c,d,e,f等字段,每个字段可以选择多种查询筛选,比如a>50 a<100 a<>140 a>200 a not in (55,67,89)等,这些关系可以进行与或选择。
如何确定优先关系,因为与或的先后顺序会有影响的。
在复选框的事件中添加代码。
DGVLog.Columns.Clear();
string SQL = "Select * from SMSLog where ID > 0 ";//初始化一个SQL查询语句
if (!(CHKBOperationType.Checked || CHKBCarNumber.Checked || CHKBDate.Checked || CHKDWResult.Checked))
{
MessageBox.Show("开始查询前,请至少选择一个查询条件!", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{ //if (CHKBUserName.Checked)
//{
// if (combUserName.Text == "")
// {
// MessageBox.Show("请选择或输入需要查询的用户名!", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
// return;
// }
// else
// {
// SQL += " and username = '" + combUserName.SelectedItem.ToString().Trim() + "'";
// }
//}
if (CHKBOperationType.Checked)
{
if (combOperationType.Text == "")
{
MessageBox.Show("请选择或输入需要查询的操作类型!", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
SQL += " and RecOrSend = '" + combOperationType.SelectedItem.ToString().Trim() + "'";
}
}
if (CHKBCarNumber.Checked)
{
if (combCarNumber.Text == "")
{
MessageBox.Show("请选择或输入需要查询车牌号码!", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
SQL += " and CarNumber ='" + combCarNumber.SelectedItem.ToString().Trim() + "'";
}
}
if (CHKDWResult.Checked)
{
if (ComboxDWResult.Text == "")
{
MessageBox.Show("定位结果不能为空,如果不过滤定位结果,\r请不要将其上的复选框选中!", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
//MessageBox.Show("接收手机号不能为空,如果不需要过滤其他关键字,请不要将其他关键字复选框选中!", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
SQL += " and DWResult = '" + ComboxDWResult.Text.Trim() + "'";
}
}
if (CHKBRecNumber.Checked)
{
if (TextRecNumber.Text == "")
{
MessageBox.Show("接收手机号不能为空,如果不需要过滤手机号,\r请不要将其上的复选框选中!", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
SQL += " and RecPhoneNumber like '%" + TextRecNumber.Text + "%'";
}
}
if (CHKBDate.Checked)
{
if (DTPEnd.Value.Date < DTPStart.Value.Date)
{
MessageBox.Show("开始日期不能晚于结束日期", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
SQL += "and OperationDateTime > #" + DTPStart.Value.Date + "# and OperationDateTime < #" + DTPEnd.Value.Date.AddDays(1.0) + "#";
}
}
SQL += " order by ID";
LoadDGV(SQL);
}
}
catch(Exception err)
{
Tools.ShowMessage(err.ToString(), MessageBoxIcon.Information);
}
具体思路就是,先初始化一个SQL查询语句,然后遍历所有条件,有条件的就在SQL语句后加上相应条件,没有条件的就不在SQL语句后加了。
我的程序和楼主需求一样,这是我想了很久才想到的。
not in 用left join代替
大于号等于号 不等于号,用一个下拉菜单选择,紧跟一个textbox ,然后又是下拉菜单紧跟textboxnot in 可以用一个textbox 里面输入的内容可以用空格和逗号分隔,后台自动处理成逗号分隔。
如果是并集的就在下拉框里写条件,如果是不同级别,多条件的,就另做一个文本框,以此类推
你的方法和我遇到问题的侧重点不太一样。这个问题我已经参考过几种方法 基本上就是拼SQL
比如第1列 第2列 第4列 第5列
姓名 等于 张三 AND
出生日期 大于 1980-1-1 AND
出生日期 小于 1986-1-1 OR
姓名 等于 李四
not 可以用 不等于 代替
如果要()就更麻烦点,而且要多加列,不过至于搞这么复杂么,最 常用的无非是一个条件或2个条件,AND和OR混用都不多,这么复杂,客户搞这么查询语句的时间还不如分2次查,做模块前,先想想如果这个东西你来用。你会不会用得不爽
foreach datarow
{
sql+=.....
parameters addwithvalue...
}
foreach datarow
{
sql+=" AND ..... "
parameters addwithvalue...
}
的确,我也想过其他的方式来实现。这个查询看似太复杂,即使实现了 给客户用也未必好用,但是客户一而再,再而三的提出要这样做,而且AND OR混用也很多,没办法,往往这些单位就是这样。我们只能尽量去满足他所要的
混用就麻烦点了,要考虑优先级,最后加一列,就成这样姓名 等于 张三 AND (
出生日期 大于 1980-1-1 OR
出生日期 小于 1986-1-1 )AND
姓名 等于 李四
而且如果选择的比如是姓名,也就是字符串,自动第2列填充等于、不等于、相似,而如果是日期。自动填充的是从、到等一些人性化的词语
现在一直在说明的都是如何查询多条件查询但是现在遇到的问题是并列关系是否没有执行顺序问题呢
条件A OR 条件B AND 条件C
与
条件A AND 条件C OR 条件B
得到结果似乎是不一样的吧
不过看你的需求,说混用挺多的,估计如果不能说服,其实不是做查询了,最好是做成一个带字段的计算公式编辑器了
string sqlwhere = "0=0 ";
if(a.check == true)//这里你自己看要怎么判断
sqlwhere = sqlwhere + "and a >" + 条件1;
。
就怎么下去,最后把sqlwhere放到你的select语句后面就好了,
注意空格的位置。。
怕注入的话就用参数类型来执行语句,麻烦点而已,安全好