0

我有七个输入框,人们可以在其中输入值。这些值与表格进行比较,最终会出现结果,这是一个搜索功能。现在我有一个包含三个输入框的页面并编辑以下内容:

if (box1 is filled && box2 is filled & box 3 is filled) {
sql="take all three values into account when comparing..";
}

if (box1 is not filled && box2 is not filled & box 3 is nog filled) {
sql="take no values into account when comparing..";
}

and so on...

对于三个盒子,这没关系,你只有几个与三个盒子的组合。然而,这对于 7 个盒子是不可行的,你会得到更多的组合!如何使我的 SQL 依赖于填写的字段?希望大家有一个聪明的解决方案!

4

2 回答 2

2

您可以使用COALESCE(或ISNULL):

...
WHERE Column1 = COALESCE(@Column1, Column1) 
AND   Column2 = COALESCE(@Column2, Column2) 
...
AND   Column7 = COALESCE(@Column7, Colum7) 

因此,只有当参数不为空时,WHERE才会应用于该字段。

于 2012-10-16T15:36:13.870 回答
1

分段构建查询。像:

StringBuilder where=new StringBuilder();
String conj=" where ";
if (box1.length()>0)
{
  where.append(conj).append("value1=").append(esc(box1));
  conj=" and ";
}
if (box2.length()>0)
{
  where.append(conj).append("value2=").append(esc(box2));
  conj=" and ";
}
... etc ...
String sql="select value1, value2, value3 from mytable" + where.toString();

几点注意事项:

假设您不知道可以输入哪些字段组合,您可能需要进行一些操作才能正确连接,即您不希望查询显示“where and value2='x'”。上面的代码将“where”放在第一个条件之前,将“and”放在以下每个条件之前。

旁注:当您构建这样的查询时,您需要注意 SQL 注入。编写一个转义函数——在这里我假设你称之为“esc”——将任何引号加倍。对于大多数 SQL 引擎,这就是您所要担心的。有些还有其他魔法角色,比如 backslah,你也需要逃脱。或者,您可以构建一个准备好的语句,然后返回并填写值。这更安全,但会强制您检查两次填写了哪些字段,一次用于构建 SQL,第二次用于填写值。这有点混乱,但更安全。永远不要将用户输入的值插入到 SQL 语句中,只需输入 "'"+value+"'":这会让你对输入 "' ; delete from user; select * from user where 的黑客敞开大门'

于 2012-10-16T15:58:53.003 回答