表Info结构
id (int)
year (int)
month (int)
day (day)
name (varchar)
想做个模糊查询,查询条件有可能年月日都为空,或者只填年或者月,
如果hql写成 select * from info where year like '%?%' and month like '%?%' and day like '%?%' and name like '%?%'的话。假如条件只填了月份,比如查询1月,就连11月也查出来了。唉。
如果写成select * from info where year =? and month =? and day =? and name like '%?%',如果查询时年月日为空,那就查不出东西了,该如何去调整这SQL语句?
id (int)
year (int)
month (int)
day (day)
name (varchar)
想做个模糊查询,查询条件有可能年月日都为空,或者只填年或者月,
如果hql写成 select * from info where year like '%?%' and month like '%?%' and day like '%?%' and name like '%?%'的话。假如条件只填了月份,比如查询1月,就连11月也查出来了。唉。
如果写成select * from info where year =? and month =? and day =? and name like '%?%',如果查询时年月日为空,那就查不出东西了,该如何去调整这SQL语句?
这样判断试试
String sql="select * from info where 1=1"
if(年不是空){
sql+="and year =?";
}
if(月不是空){
sql+="and month =?";
}
if(日不是空){
sql+="and day =?";
}
你是要这个效果么?
年月日可能有不同的组合:
可能是全部都空;
可能是年 or 月 or 日 or (年+月) or (月+日),后台用HQL,这几组不同组合搞得后台代码比较多,我想有没办法直接在mysql查询时就解决到
like 是模糊查询的关键字。
% 是通配符,代表多个任意匹配,比如 '%人民' 就是搜索前半段是任意字符,结尾是人民的记录,类似的可以将 % 放在条件字段的任意位置。
_ 是单个字符的统配符,可以匹配单个任意字符。PHP 不需要像你这样写,双引号中出现的变量将自动被解析。
$sql = "SELECT * FROM oneself WHERE name like '%{$colname_Recordset1}' LIMIT {$startRow_Recordset1}, {$maxRows_Recordset1}";
$Recordset1 = mysql_query($sql) or die(mysql_error());{} 放在变量两边是直接指明这是个变量及该变量的名字,如果遇到数组类型的变量效果比较明显,不然可能会造成数组型变量名解析出错。
逻辑上就可以了。
或者更一般的做法是在用一个日历控件放在text里面直接进行选择
if(年不是空){
sql+="and year =?";
}
if(月不是空){
sql+="and month =?";
}
if(日不是空){
sql+="and day =?";
}
if(name不是空)
sql+= "name like '%?%' "就可以了啊 模糊查询就是那样子
if(year!=null){
sql.append("and year like '%?%'");
}
if(month!=null){
sql.append(" or month like '%?%'");
}
if(day!=null){
sql.append(" or day like '%?%');
}
if(name!=null)
sql.append(" or name like '%?%'");//注意前面的空格,最后toString()就行了就可以了啊 模糊查询就是那样子
再判断不为空就追加