在Asp.Net网站或者Java网站的程序设计的过程中,很多时候我们可以看到拼接SQL语句的写法的时候都可以看到最前面有个Where 1=1这个条件,其实Where 1=1这是个恒等式,SQL语句写成Where 1=1的形式可以更好的拼接查询语句条件。

结论:Where 1=1为恒等式,拼接SQL语句使用Where 1=1这个语句段主要是为了后续更好的拼接成完成的SQL语句。

举例,前台页面可能传入参数Name和Code两个参数值,都是对应SQL语句查询条件,但这两个查询条件也可全为空,即不传实际参数,在程序中我们时常会看到下面的写法。

string  sql="Select *   FRom TableA Where 1=1";
if( string.IsNullOrWhiteSpace(Name))
{
sql=sql+string.Format(" AND Name={0}",Name);
}
if( string.IsNullOrWhiteSpace(Code))
{
sql=sql+string.Format(" AND Code={0}",Code);
}

使用了Where 1=1这个恒等式后,后续只需要判断对应的属性值是否为空,不为空直接加入对应的拼接SQL语句段。如果不加入Where 1=1这个条件,代码可读性就会变得更差,可能出现下列几种情况,读者可自行思考下。

(1)Name和Code的值都为空,则Sql语句是不能带Where的,直接是:Select *   FRom TableA

(2)如果Name、Code有一个为空,另一个不为空的时候,Sql语句是不会带有And这个关键字,Sql最终语句要么为Select *   FRom TableA Where Name=@Name 要么为Select *   FRom TableA Where Code=@Code;

(3)如果Name、Code都不为空的时候,语句中就含有AND这个关键字,但Name条件前不会有AND关键字。可以想象下如果有10个查询条件,是不是还要判断下那个查询条件属性是SQL语句中的第一个查询字段。这样的判断就麻烦多了。

当然如果不用Where 1=1这种写法,还有种稍微容易阅读的方法可采用,就是单独定义个字段sqlFilter用于查询条件的拼接,最后判断下sqlFilter是否为空,如果不为空,则截取掉该sqlFilter字符串的最前面几个字符 AND之后得到最终查询条件,拼接到查询语句Sql中。

备注:原文转载自博主个人技术站点IT技术小趣屋,原文链接程序设计过程中SQL语句Where 1=1的作用_IT技术小趣屋

博主个人技术交流群:960640092,博主微信公众号如下:

【转载】程序设计过程中SQL语句Where 1=1的作用的更多相关文章

  1. 转:Oracle中SQL语句执行过程中

    Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1.当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法.表名.字 ...

  2. 跟踪oracle中sql语句运行过程及相关知识拓展

    select * from v$sqlarea; select * from v$sqlarea where first_load_time>'2010-11-27/09:30:00'; 这种方 ...

  3. oracle过程中动态语句实现

    oracle过程中动态语句实现 一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DD ...

  4. oracle 中SQL 语句开发语法 SELECT INTO含义

    oracle 中SQL 语句开发语法 SELECT INTO含义 在ORACLE中SELECT INTO是如何使用的,什么意思?和SQL SERVER的不一样?   和sqlserver的不一样sql ...

  5. Oracle ------ SQLDeveloper中SQL语句格式化快捷键

    Oracle SQL Developer中SQL语句格式化快捷键: 每次sql复制到SQL Developer面板的时候,格式老不对,而且看起来很不舒服,所有的sql都挤在一行完成. 这时我们可以全选 ...

  6. html5 webDatabase 存储中sql语句执行可嵌套使用

    html5 webDatabase 存储中sql语句执行可嵌套使用,代码如下: *); data.transaction(function(tx){ tx.executeSql("creat ...

  7. 详解Java的MyBatis框架中SQL语句映射部分的编写

    这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...

  8. oracle中sql语句的优化

    oracle中sql语句的优化 一.执行顺序及优化细则 1.表名顺序优化 (1) 基础表放下面,当两表进行关联时数据量少的表的表名放右边表或视图: Student_info   (30000条数据)D ...

  9. Oracle SQL Developer中SQL语句格式化快捷键

    Oracle SQL Developer中SQL语句格式化快捷键 格式化SQL语句:Ctrl+F7

随机推荐

  1. Nginx之https配置 - 运维笔记 (http->https强转)

    一.Nginx安装(略)安装的时候需要注意加上 --with-http_ssl_module,因为http_ssl_module不属于Nginx的基本模块.Nginx安装方法: # ./configu ...

  2. java-mybaits-015-mybatis逆向工程最佳实践【基础mybatis-generator、tk.mybatis、mubatis-plus】

    一.概述 三款框架的功能对比 Mybatis-generator 通用Mapper Mybatis-Plus 代码生成器 支持自动生成Model,Mapper,Mapper XML文件 生成方式不够灵 ...

  3. 【php】PHP制作QQ微信支付宝三合一收款码

    分析 微信扫这个,支付宝扫那个,不仅要加载多张二维码,还要加css/js让它变的好看,作为一个又懒又不想写这些东西的程序猿来说,这可不行. 那能不能把QQ微信支付宝三合一,只需要扫一个收款码就行呢? ...

  4. Python - Django - 命名空间模式

    新建一个项目 app02 在 app02/ 下创建 urls.py: from django.conf.urls import url from app02 import views urlpatte ...

  5. Swift4.0复习操作符方法与操作符的定制

    1.对已有操作符的重载: 2.可定制的操作符: 3.定制前缀操作符: 4.定制后缀操作符: 5.定制中缀操作符:

  6. Java使用Jsoup获得新闻联播所有文字稿

    Jsoup的maven坐标: <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> <dependency> ...

  7. ng2中 如何使用自定义属性data-id 以及赋值和取值操作

    项目环境:ng4.x 写法说明: [attr.data-nurseKey] <div [attr.data-nurseKey]="k.nurseKey"></di ...

  8. angular2-cookie 如何升级到 ngx-cookie

    angular2-cookie 如何升级到  ngx-cookie https://github.com/salemdar/angular2-cookie#readme

  9. Linux之sudo免密码操作

    使用普通用户只需特权命令是需要输入密码,然后在五分钟以内只需命令可以免密码,下面设置免密码操作 系统环境查看 切换至root用户 sudo -i #需要输入密码 修改sudoers文件 #增加一行 y ...

  10. EC11编码器的使用方法

    1. EC11编码器的原理图如下 2. 旋转的时候,波形如下,EC11转1格,产生一个上升沿的中断,思路就是检测AX4-1的上升沿中断(平时是低电平),进入中断服务函数,检测AX4-2的电平,低电平逆 ...