登录 | 注册 | 论坛 | 搜索 | 会员中心 | 关于我们
论坛首页    »   PHP技术交流   »    mysql中where 1的意义  
  
上一主题 下一主题
 标题:mysql中where 1的意义  

kuaiyigang
状态: 新的一年,新的战斗
等级: 管理员发帖: 474帖
排名: 第1名积分: 2324分
来自: 湖北随州
离线: 2008年10月31日
        
1 楼

mysql中where 1的意义

分类:

今天,小杰问俺,为啥好多的mysql语句中,都存在 where 1 这样的判断条件,出于直觉,我感觉这是一条为程序服务的方法!因为平时我也不用这样,因为我自认为比较注重程序的执行效率,怎么可能会加上这么多余的一句来影响程序的执行速度呢?虽然我曾在phpmyadmin中看过程序给过这样的写法,但是当时并没有太在意!

既然有人问到,我也就来了兴趣,我兴冲冲的冲向了mysql手册(官方的在线版本),但是一看到手册我茫然了,手册会告诉你这些的么?失望而归,又冲向百度,百了半天没百出个所以然来!没办法出杀手锏----谷歌,啥关键词? 直接就是一 “where 1=1” 结果出现“南方健康网--体验健康新生活!”“1+1家教广州家教中心-广州家教网”类似云云,就在准备放弃之时看到“SQL语句中巧用WHERE 1=1”,进去一看,明白了一些!加入where 1 这样的判断条件的确是为了程序的书写服务的!下面我们说说这样的好处吧!

where 1 其实是程序中可能需要多条判断的接口!

例如:

if(condition1) $sql1 = "and `condition1` = '."$condition1."'";
if(condition2) $sql2 = "and `condition2` = '."$condition2."'";
if(condition3) $sql3 = "or `condition3` = '."$condition3."'";

如果我们使用这样的查询 "select * from table where ".$sql1.$sql2.$sql3.";
这样的语句就不容易维护,而且如果处理不好 sql中的and 语句就出错了!
而当我们使用这样的查询时 "select * from table where 1".$sql1.$sql2.$sql3.";
实际得出的结果就可能会是(如果以上$condition1~3都满足!):
"select * from table where 1 and `condition1` = '."$condition1."' and `condition2` = '."$condition2."' or `condition3` = '."$condition3."';
这样的话,程序中的mysql语句是不是就很容易维护呢?
至于数据库查询性能与可维护性,语句的简易性相比,你选择如何,那就是仁者见仁,智者见智的问题了!


  www.kuaiyigang.com
2008-06-19 17:24:45      
kuaiyigang
状态: 新的一年,新的战斗
等级: 管理员发帖: 474帖
排名: 第1名积分: 2324分
来自: 湖北随州
离线: 2008年10月31日
        
2 楼

where 1=1的作用

where 1=1
最近看到很多sql里用到where 1=1,原来觉得这没用嘛,但是又想到如果没用为什么要写呢?于是在网上

查了查,在这里就浅谈一下:
1=1 永真, 1<>1 永假。

1<>1 的用处:
用于只取结构不取数据的场合
例如:
create table table_temp tablespace tbs_temp as
select * from table_ori where 1<>1
建成一个与table_ori 结构相同的表table_temp,但是不要table_ori 里的数据。(除了表结构,其它结

构也同理)

1=1的用处
用于动态SQL
例如 lv_string := 'select tbl_name,tbl_desc from tbl_test where 1=1 '||l_condition;
当用户选择了查询的名称'abc'时l_condition :='and tbl_name = ''abc'''';但是当用户没有

选择名称查询时l_condition就为空 这样 lv_string = 'select tbl_name,tbl_desc from tbl_test

where 1=1 ' ,运行也不会出错,相当于没有限制名称条件。但是如果没有1=1的条件,则lv_string =

'select tbl_name,tbl_desc from tbl_test where ';这样就会报错。

除了1=1 或1<>1之外的其它永真永假的条件同理。


  www.kuaiyigang.com
2008-06-19 17:25:27      
sina
状态: 你看我干什么?
等级: 会员发帖: 45帖
排名: 第1名积分: 83分
离线: 2008年09月05日
        
3 楼


不明白啊,不明白,有没有更浅显的语言。

2008-06-23 12:31:09      
sina
状态: 你看我干什么?
等级: 会员发帖: 45帖
排名: 第1名积分: 83分
离线: 2008年09月05日
        
4 楼


看懂了一点点,但是这个怎么会不报错呢?

lv_string := 'select tbl_name,tbl_desc from tbl_test where 1=1 '||l_condition

这样如果为空应该是这样的吧,怎么会不报错呢:

lv_string := 'select tbl_name,tbl_desc from tbl_test where 1=1 '||

2008-06-23 12:33:51      
wenzhenchun
状态: 这家伙又在潜水~
等级: 会员发帖: 1帖
排名: 第1名积分: 2分
离线: 2008年07月17日
        
5 楼


哦。明白了。也就是当判断sql语句的时候。where 1=1相当于最后的一个默认选项。当其他条件都不等于要查的条件时,后者根本查不到要查到条件时候。where 1=1永远是true,所有就会执行 'select tbl_name,tbl_desc from tbl_test 。

不知道理解对不对。我感觉是这样的

2008-07-17 15:13:17      
  
51/11


Powered by BbsFine 0.2 © 2002-2008 Xingmo.com Archiver
星模公司 ©2008 版权所有 京ICP备05011686号