根据输入值的SQL

时间:2012-10-16 15:33:18

标签: sql input

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

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可靠的填充字段?希望你们有一个聪明的解决方案!

2 个答案:

答案 0 :(得分:2)

您可以使用COALESCE(或ISNULL):

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

因此,只有当参数不为null时,才会在该字段上应用WHERE

答案 1 :(得分: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 +“'”:这使您可以对输入“';从用户删除;从用户中选择*的黑客敞开大门'X'='”。他所要做的只是猜一个表名。