sql where拼接技巧

简介:

1.将where语句从分支移到主干,解决where在分支上的多种情况,分支条件只需and 连接即可如where1==1等

$sql="SELECT * FROM bb where true ";

因为使用添加了“1=1”的过滤条件以后数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(也就是全表扫描)以比较此行是否满足过滤条件,当表中数据量比较大的时候查询速度会非常慢。优化方法

test.html

Java代码   收藏代码
  1. <td>商品名称:</td>  
  2. <td width="200"><input type="text" class="text" name="kit_name" id="fn_kit_name"/></td>  
  3. <td align="right">备案开始日期:</td>  
  4. <td width="200"><input type="text" name="search[or_get_reg_date]"/><img src="images/data.jpg" /></td>  
  5. <td>备案结束日期:</td>  
  6. <td width="200"><input type="text" name="search[lt_reg_date]"/><img src="images/data.jpg" /></td>  
  7. </tr>  
  8. <tr>  
  9.     <td>产品经理:</td>  
  10.     <td><input type="text" class="text" name="search[managerid]"/></td>  
Java代码   收藏代码
  1. <?php  
  2. $postData = array(  
  3.     'managerid' => '21',  
  4.     'or_get_reg_date' => '09',  
  5.     'lt_reg_date' => '2012-12-19',  
  6.     'in_id' => array(123),  
  7. );  
  8. $tmpConditions = transArrayTerms($postData);  
  9. echo $whereCause = getWhereSql($tmpConditions);  
  10. // WHERE managerid like '21%' OR reg_date<'09' AND reg_date>'2012-12-19' AND id in ('1','2','3')  

处理where条件的sql

Java代码   收藏代码
  1. <?php  
  2. /** 
  3.  * 表单提交值转化成where拼接数组 
  4.  */  
  5. function transArrayTerms($infoSearch) {  
  6.     $aryRst = array();  
  7.     $separator = array('lt'=>'<''let'=>'<=''gt'=>'>''get'=>'>=''eq'=>'=''neq'=>'<>');  
  8.     foreach ($infoSearch as $term => $value) {  
  9.         if (empty($value)) continue;  
  10.   
  11.         $name = $term;  
  12.         if (strpos($term, "or_") !== false) { //添加or连接符  
  13.             $terms['useOr'] = true;  
  14.             $name = str_replace("or_""", $term);  
  15.         }  
  16.   
  17.         if (strpos($name, "in_") !== false) {  
  18.             $terms['name'] = str_replace("in_""", $name);  
  19.             $terms['charCal'] = " in ";  
  20.             $terms['value'] = "('" . implode("','", $value) . "')";  
  21.         } else {  
  22.             $terms['name'] = $name;  
  23.             $terms['charCal'] = " like ";  
  24.             $terms['value'] = "'" . trim($value) . "%'";  
  25.         }  
  26.         //放在else后面  
  27.         foreach($separator as $charCalName =>$charCalVal){  
  28.             if (strpos($name, $charCalName."_") !== false) {  
  29.                 $terms['name'] = str_replace($charCalName."_""", $name);  
  30.                 $terms['charCal'] = $charCalVal;  
  31.                 $terms['value'] = "'" . trim($value) . "'";  
  32.             }  
  33.         }  
  34.         $aryRst[] = $terms;  
  35.         unset($terms);  
  36.     }  
  37.     return $aryRst;  
  38. }  
  39.   
  40. function whereOperator($has_where, $useOr) {  
  41.     $operator = $has_where ? ($useOr === false ? ' AND ' : ' OR ') : ' WHERE ';  
  42.     return $operator;  
  43. }  
  44.   
  45. /** 
  46.  * aryTerm transArrayTerms转化后的查询条件 
  47.  * @过滤没有输入的sql查询条件并转化成where条件. 
  48.  */  
  49. function getWhereSql($aryTerm) {  
  50.     $whereCause = '';  
  51.     if (count($aryTerm) > 0) {  
  52.         $has_where = '';  
  53.         foreach ($aryTerm as $value) {  
  54.             $has_where = whereOperator($has_where, isset($value['useOr']));  
  55.             $whereCause .= $has_where . $value['name'] . $value['charCal'] . $value['value'];  
  56.         }  
  57.     }  
  58.     return $whereCause;  
  59. }  
相关文章
|
4月前
|
SQL 数据库
SQL 查询优化指南:SELECT、SELECT DISTINCT、WHERE 和 ORDER BY
SQL的SELECT语句用于从数据库中选择数据。SELECT语句的基本语法如下:
53 1
|
3月前
|
SQL 流计算
在Flink SQL中,如果在使用表别名后,WHERE子句中使用了别名,可能会出现找不到表的问题
【1月更文挑战第4天】【1月更文挑战第18篇】在Flink SQL中,如果在使用表别名后,WHERE子句中使用了别名,可能会出现找不到表的问题
32 1
|
3月前
|
SQL Oracle 关系型数据库
sql语句两个字段合并或者两个字段拼接显示
sql语句两个字段合并或者两个字段拼接显示
|
4月前
|
存储 SQL Oracle
|
6月前
|
SQL
一条集多表查询、字段与字段拼接、合并每张表共同字段、新增列并赋值的SQL
一条集多表查询、字段与字段拼接、合并每张表共同字段、新增列并赋值的SQL
26 0
|
6月前
|
SQL
29MyBatis - 动态SQL的 where标签
29MyBatis - 动态SQL的 where标签
28 0
|
8月前
|
SQL 开发框架 .NET
sql 不同where下的统计
sql 不同where下的统计
51 0
|
10月前
|
SQL 存储 数据库连接
【批量添加】-拼接sql字符串
【批量添加】-拼接sql字符串
100 0
|
10月前
|
SQL 测试技术
软件测试|SQL指定查询条件,WHERE的使用
软件测试|SQL指定查询条件,WHERE的使用
92 1
|
11月前
|
SQL Java 数据库连接
MyBatis动态SQL中if、where、trim、choose、when、otherwise、foreach标签及sql标签范例
MyBatis动态SQL中if、where、trim、choose、when、otherwise、foreach标签及sql标签范例
98 0