`
hudeyong926
  • 浏览: 2035051 次
  • 来自: 武汉
社区版块
存档分类
最新评论

sql where查询拼接技巧

阅读更多

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

<?php
$name = $userId = 1;
$whereConditions ="";
if($userId){
	$whereConditions .= " and userid={$userId}";
}
if($name){
	$whereConditions .= " and name='{$name}'";
}
$whereConditions = str_replace(array("and", "AND"), "AND", $whereConditions);
$whereConditions = str_replace(array("or", "OR"), "OR", $whereConditions);
$whereConditions = trim($whereConditions);
$whereConditions = ltrim($whereConditions, 'AND');
$whereConditions = ltrim($whereConditions, 'OR');
echo "where ".$whereConditions; //where userid=1 AND name='1'

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

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

test.html

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

处理where条件的sql

<?php
/**
 * 表单提交值转化成where拼接数组
 */
function transArrayTerms($infoSearch) {
    $aryRst = array();
    $separator = array('lt'=>'<', 'let'=>'<=', 'gt'=>'>', 'get'=>'>=', 'eq'=>'=', 'neq'=>'<>');
    foreach ($infoSearch as $term => $value) {
        if (empty($value)) continue;

        $name = $term;
        if (strpos($term, "or_") !== false) { //添加or连接符
            $terms['useOr'] = true;
            $name = str_replace("or_", "", $term);
        }

        if (strpos($name, "in_") !== false) {
            $terms['name'] = str_replace("in_", "", $name);
            $terms['charCal'] = " in ";
            $terms['value'] = "('" . implode("','", $value) . "')";
        } else {
            $terms['name'] = $name;
            $terms['charCal'] = " like ";
            $terms['value'] = "'" . trim($value) . "%'";
        }
        //放在else后面
        foreach($separator as $charCalName =>$charCalVal){
            if (strpos($name, $charCalName."_") !== false) {
                $terms['name'] = str_replace($charCalName."_", "", $name);
                $terms['charCal'] = $charCalVal;
                $terms['value'] = "'" . trim($value) . "'";
            }
        }
        $aryRst[] = $terms;
        unset($terms);
    }
    return $aryRst;
}

function whereOperator($has_where, $useOr) {
    $operator = $has_where ? ($useOr === false ? ' AND ' : ' OR ') : ' WHERE ';
    return $operator;
}

/**
 * aryTerm transArrayTerms转化后的查询条件
 * @过滤没有输入的sql查询条件并转化成where条件.
 */
function getWhereSql($aryTerm) {
    $whereCause = '';
    if (count($aryTerm) > 0) {
		$has_where = '';
        foreach ($aryTerm as $value) {
            $has_where = whereOperator($has_where, isset($value['useOr']));
            $whereCause .= $has_where . $value['name'] . $value['charCal'] . $value['value'];
        }
    }
    return $whereCause;
}
分享到:
评论

相关推荐

    动态拼接sql语句工具类,拼接where后面语句

    动态拼接sql语句工具类,拼接where后面语句 配合原生jdbc仿动态sql注入 if (ObjectUtil.isNotEmpty(maxLat)&&ObjectUtil.isNotEmpty(minLat)){ sqlParamList.add(new SqlParam("lat",minLat, SqlOpEnum.GE)); ...

    sql拼接:不要拼接Sql,而要使用参数的好处

    ### SQL拼接与参数化查询的重要性 在软件开发过程中,特别是涉及到数据库操作的应用程序中,SQL语句的构造和执行是非常关键的一步。传统的做法往往采用字符串拼接的方式来构建SQL语句,例如: ```csharp string ...

    hibernate hql where语句拼接工具类

    WHERE子句用于在查询结果中指定特定的条件,类似于SQL中的WHERE。例如,如果你有一个User实体,你可能想要查询所有年龄大于30岁的用户,HQL语句可能如下所示: ```java String hql = "FROM User WHERE age &gt; :age";...

    SQL语句拼接

    添加了一条基础的SQL语句,其中`Tuser`是数据库中的表名,`t`是别名,`where 1=1`是一个常用的技巧,可以确保后面的条件能够正常拼接到SQL语句中。 4. **根据条件添加额外的SQL子句**: ```java if (name != ...

    MyBatis动态拼接SQL

    在某些场景下,我们可能需要根据业务逻辑动态地拼接SQL语句,以实现更复杂的查询需求。这就是MyBatis动态SQL的功能所在。 动态SQL是MyBatis的一大特色,它使得我们能够在运行时根据条件构建SQL语句。MyBatis通过`...

    sql\(很长的l模糊查询拼接)sql存储过程

    标题中的“SQL(很长的L模糊查询拼接)”意味着该存储过程主要涉及的是通过字符串拼接的方式动态构建SQL查询语句,这里的“L”可能是指“Long”,即长字符串处理;而“模糊查询”则是指通过部分匹配的方式来检索数据...

    易语言动态拼接sql语句

    在编程领域,动态拼接SQL语句是一种常见的技术,它允许程序在运行时根据需要构建SQL查询。在易语言这个中国本土化的编程环境中,动态拼接SQL同样具有重要的应用价值。易语言以其独特的汉字编程风格,降低了编程的...

    SQL拼接工具包API 支持Oracle/PostgreSQL/MySql

    简化sql拼接过程,提升开发效率,减少拼接错误。 可以拼接select、update、delete语句以及where条件语句。 拼接where条件可自动组织参数并返回。 支持andEq(), andGt(), andGe(),andLt(), andLe(), andEqDate(), ...

    Sql Server参数化查询之where in和like实现详解

    Sql Server参数化查询之where in和like实现详解 在Sql Server中,参数化查询是提高查询性能和防止SQL注入攻击的有效方法之一。其中,where in和like是两个常用的查询条件,然而它们的参数化实现却不是那么简单。...

    SqlUtils工具类,Sql IN 条件拼接工具类

    `SqlUtils`工具类是Java开发中用于处理SQL语句拼接的一个实用工具,特别是针对包含`IN`条件的查询。在数据库操作中,`IN`关键字常用于筛选满足特定集合条件的记录。例如,假设我们需要查找ID在一组值中的用户,我们...

    Java 使用注解拼接SQL语句

    "Java使用注解拼接SQL语句"是一个常见的实践,它使得动态构建SQL查询变得更为简洁和可维护。这种技术通常与ORM(对象关系映射)框架如MyBatis或Hibernate结合使用,但也可以通过自定义处理逻辑实现。 1. **自定义...

    Yii Framework 2.0 Where条件拼接 pdf

    总而言之,Yii Framework 2.0通过Active Record模式和强大的查询构建器为开发者提供了一套完善的数据库操作解决方案,通过where条件拼接等高级查询功能极大地简化了复杂查询的构建过程,使得开发者能够更专注于业务...

    动态拼接sql语句.rar

    动态拼接SQL语句在IT行业中是一个常见的编程实践,尤其在数据库操作中,它允许根据程序运行时的条件或变量来构建SQL查询。这一技术在处理复杂查询逻辑、灵活的数据筛选以及减少代码冗余等方面具有显著的优势。然而,...

    JDBC中动态拼接SQL的工具类

    JDBC中动态拼接SQL的工具类。 对于使用纯SQL访问数据库的同学会有些帮助。 并具有一定的扩展性。

    sql 多行合并某一列字符串拼接的示例

    在SQL中,将多行数据合并为一行,尤其是在某一列进行字符串拼接,是一项常见的需求。这通常用于汇总数据、创建报表或者为了分析目的而整合信息。本文将深入探讨如何利用SQL实现多行数据的合并,特别关注字符串拼接的...

    页面传入多个条件——sql语句的拼接

    这里初始化SQL语句为“select * from book where 1=1”,其中`where 1=1`是一个常见的技巧,用于确保后续添加的条件之前总能有`WHERE`或`AND`关键字。 2. **根据条件拼接SQL语句**: - **bookID条件**: ```...

    sqlserver的存储过程与 where in 多值参数

    本文将探讨在SQL Server中,存储过程与`WHERE IN`子句结合使用时,处理多值参数的几种方法。 **方法一:拼接SQL字符串并调用`EXEC`** 这是最简单也是最直观的方法。你可以在存储过程中接收一个包含多个值的参数,...

    Golang sqlx 使用sql语句 Where in 解决办法

    方法1、使用语言的for语句循环生成SQL语句中的“?”,类似这样: 新建方法 func placeholders(n int) string { var b strings.Builder for i := 0; i 0 { b.WriteString("?") } return b.String() }  调用...

    《kettle中实现动态SQL查询》博客文章示例代码

    本文将深入探讨如何在Kettle中实现动态SQL查询,这对于处理复杂的数据库操作和数据迁移至关重要。我们将讨论问号占位符和命名参数这两种方法,并分析它们的区别。 首先,让我们理解什么是动态SQL查询。在传统的SQL...

    pgsql拼接pgsql拼接pgsql拼接

    在SQL的世界里,`pgsql`通常指的是PostgreSQL,一个强大的开源...总的来说,了解并熟练掌握PostgreSQL中的字符串拼接技巧,对于处理和展示数据库中的复杂信息至关重要,尤其是在医疗、金融等需要详尽记录和报告的领域。

Global site tag (gtag.js) - Google Analytics