刚接手别人的项目~发现里面很多这样的写法~请问这样的写法有什么作用?谢谢!

解决方案 »

  1.   


    这段代码应该是由程序(例如Java)中生成的,where条件中 1=1 之后的条件是通过 if 块动态变化的。例如:
      String sql="select * from table_name  where 1=1";
            if( conditon 1) {
                  sql=sql+"  and  var2=value2";
                }
            if(conditon 2) {
                  sql=sql+"  and var3=value3";
               }
      where 1=1 是为了避免where 关键字后面的第一个词直接就是 “and”而导致语法错误。
      

  2.   


    where 1=1妙用主要是为了便于动态连接后续条件,即使后面的查询条件都为空都可以查询,还有就是避免后面是and而出错。
    where 1=1有什么用?在SQL语言中,写这么一句话就跟没写一样。     
    select * from table1 where 1=1与select * from table1完全没有区别,甚至还有其他许多写法,1<>2,'a'='a','a'<>'b',其目的就只有一个,where的条件为永真,得到的结果就是未加约束条件的。 
        
    在SQL注入时会用到这个,例如select * from table1 where name='lala'
    给强行加上select * from table1 where name='lala' or 1=1这就又变成了无约束的查询了。  
       
    最近发现的妙用在于,在不定数量查询条件情况下,1=1可以很方便的规范语句。
    例如一个查询可能有name,age,height,weight约束,也可能没有,那该如何处理呢?     
    String sql=select * from table1 where 1=1  什么要写多余的1=1?马上就知道了。    
    if(!name.equals("")){   
    sql=sql+"name='"+name+"'";   
    }   
    if(!age.equals("")){   
    sql=sql+"age'"+age+"'";   
    }   
    if(!height.equals("")){   
    sql=sql+"height='"+height+"'";   
    }   
    if(!weight.equals("")){   
    sql=sql+"weight='"+weight+"'";   
    }     
    如果不写1=1呢,那么在每一个不为空的查询条件面前,都必须判断有没有where字句,否则要在第一个出现的地方加where  
     
    今天看到:"SELECT * FROM strName WHERE 1 = 0";   
    不理解为什么有1=0?     
    查询得出答案:     
    该select语句主要用于读取表的结构而不考虑表中的数据,这样节省了内存,因为可以不用保存结果集。   
    另外,这个用在什么地方呢?主要用于创建一个新表,而新表的结构与查询的表的结构是一样的。如下SQL语句:     
    create table newtable as select * from oldtable where 1=0;  
      

  3.   


    SQL> select * from emp where 1=0;
    /*
    EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------*/
    SQL> select * from dept where 1>2;
    /*
    DEPTNO DNAME          LOC
    ------ -------------- -------------*/
    SQL> select * from dept where 1=1;
    /*
    DEPTNO DNAME          LOC
    ------ -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
    */
    SQL> select * from dept where 1<2;
    /*
    DEPTNO DNAME          LOC
    ------ -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
    */
    SQL> create table emp_t as select * from emp where 1=0;Table createdSQL> desc emp_t;
    Name     Type         Nullable Default Comments 
    -------- ------------ -------- ------- -------- 
    EMPNO    NUMBER(4)    Y                         
    ENAME    VARCHAR2(10) Y                         
    JOB      VARCHAR2(9)  Y                         
    MGR      NUMBER(4)    Y                         
    HIREDATE DATE         Y                         
    SAL      NUMBER(7,2)  Y                         
    COMM     NUMBER(7,2)  Y                         
    DEPTNO   NUMBER(2)    Y                         SQL> select * from emp_t;
    /*
    EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------*/
    --下面未加上限制条件 where 1=0;
    SQL> create table t_emp as select * from emp;Table createdSQL> desc t_emp;
    /*
    Name     Type         Nullable Default Comments 
    -------- ------------ -------- ------- -------- 
    EMPNO    NUMBER(4)    Y                         
    ENAME    VARCHAR2(10) Y                         
    JOB      VARCHAR2(9)  Y                         
    MGR      NUMBER(4)    Y                         
    HIREDATE DATE         Y                         
    SAL      NUMBER(7,2)  Y                         
    COMM     NUMBER(7,2)  Y                         
    DEPTNO   NUMBER(2)    Y                         
    */
    SQL> select * from t_emp;
    /*
    EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------
     7369 SMITH      CLERK      7902 1980-12-17     800.00               20
     7499 ALLEN      SALESMAN   7698 1981-2-20     1600.00    300.00     30
     7521 WARD       SALESMAN   7698 1981-2-22     1250.00    500.00     30
     7566 JONES      MANAGER    7839 1981-4-2      2975.00               20
     7654 MARTIN     SALESMAN   7698 1981-9-28     1250.00   1400.00     30
     7698 BLAKE      MANAGER    7839 1981-5-1      2850.00               30
     7782 CLARK      MANAGER    7839 1981-6-9      2450.00               10
     7788 SCOTT      ANALYST    7566 1987-4-19     3000.00               20
     7839 KING       PRESIDENT       1981-11-17    5000.00               10
     7844 TURNER     SALESMAN   7698 1981-9-8      1500.00      0.00     30
     7876 ADAMS      CLERK      7788 1987-5-23     1100.00               20
     7900 JAMES      CLERK      7698 1981-12-3      950.00               30
     7902 FORD       ANALYST    7566 1981-12-3     3000.00               20
     7934 MILLER     CLERK      7782 1982-1-23     1300.00               1014 rows selected
    /*
      

  4.   

    where l>2是为了取表结构
    如:create table temptablename as select * from tb where 1>2
      

  5.   

    -- 当然:where 'fuck'='you' 等同于:where 1=1;                                       -- 永真条件
    --           where 'fuck your mother'='fuck your mother'等同于where 1=2;  -- 永假条件
      

  6.   

    -- 当然:where 'fuck'='you' 等同于:where 1=2;                               -- 永假条件 
    -- where 'fuck your mother'='fuck your mother' 等同于 where 1=1;  -- 永真条件
      

  7.   

    有的时候加这个只是为了放入一个 where 修饰符。  否则,如果条件不为空的话, 动态判断加where 比较麻烦。