1、
Select       *       From       Table1       Where           
(Field1='1')       
or       ((Field2       in       (Select       Field1       From       testTable))   
and       (field1       is       null   )
)

解决方案 »

  1.   


    语句2   
    Select       *       From       Table1       Where           
    (Field1='1'       and       field1       is       null   )              --这个条件永远false
    or       
    (Field2       in       (Select       Field1       From       testTable)   )
    ===
    Select       *       From       Table1       Where           
    (Field2       in       (Select       Field1       From       testTable)   )
      

  2.   

    >>>优先级从高到低是       =       ,       and       ,or与in       并列   优先级从高到低是       = 与in       并列        ,       and       ,or 
      

  3.   

    晕,搂主概念混了Field1='1'       
    field1       is       null   
    Field2       in       (Select       Field1       From       testTable)   都是同一个级别的,是逻辑子句,
    优先级应该只比较not and or 
      

  4.   

    同一个级别的,是逻辑子句 不按照优先级比较吗
    优先级应该只比较not   and   or 
      

  5.   

    语句2与语句1产生不同的结果的原因因为运算优先级是 NOT AND OR 所以语句一相当于
    Select       *       From       Table1       Where           
    Field1='1'       
    or       Field2       in       (Select       Field1       From       testTable)   
    and       field1       is       null   先算 AND 
    Select       *       From       Table1       Where           
    Field1='1'  or   field1       is       null
    然后算 OR  语句一最后相当于 
     Select       *       From       Table1       Where           
    Field1='1'    语句二
      Select       *       From       Table1       Where           
    Field1='1'       and       field1       is       null   
    or       Field2       in       (Select       Field1       From       testTable) 先算 AND
    Select       *       From       Table1       Where           
    field1       is       null   
    or       Field2       in       (Select       Field1       From       testTable) 
    然后算 OR   语句二最后相当于
     
    Select       *       From       Table1       Where            Field2       in       (Select       Field1       From       testTable) 语句一
     Select       *       From       Table1       Where           
    Field1='1'   
    语句二
    Select       *       From       Table1       Where            Field2       in       (Select       Field1       From       testTable) 
    所以最后结果不一样 
      

  6.   

    好像错了哦 语句一 
      Select *   From  Table1  Where   Field1='1'   and field1 is null    
    语句二 
    Select *  From  Table1  Where   Field2 in (Select  Field1  From  testTable)   and field1 is null
      

  7.   


    --语句一:Select * From Table1 Where           
    (Field1='1')       
    or       
    (
        (Field2 in (Select Field1 From testTable))   
    and 
        (field1 is null)
    )
      

  8.   

    TO:海阔天空
    > > > 优先级从高到低是               =               ,               and               ,or与in               并列       优先级从高到低是               =   与in               并列                 ,               and               ,or   是这样吗?
    我看联机帮助里面是这样写的:
    运算符的优先顺序
    当一个复杂的表达式有多个运算符时,运算符优先性决定执行运算的先后次序。执行的顺序可能严重地影响所得到的值。运算符有下面这些优先等级。在较低等级的运算符之前先对较高等级的运算符进行求值。 +(正)、-(负)、~(按位 NOT)
    *(乘)、/(除)、%(模)
    +(加)、(+ 串联)、-(减)
    =,  >,  <,  >=,  <=,  <>,  !=,  !>,  !< 比较运算符
    ^(位异或)、&(位与)、|(位或)
    NOT
    AND
    ALL、ANY、BETWEEN、IN、LIKE、OR、SOME
    =(赋值) 
    如果按你的
    优先级从高到低是               =   与in               并列                 ,               and               ,or   这个说法我的问题2解决,但是如果按联机帮助里的说法,我的问题2还没解决??
      

  9.   

    嘿嘿~~~  不好意识了 大家(Field2 in (Select Field1 From testTable))   
    and 
        (field1 is null)
    我全部看成是 field1 了不好意识
      

  10.   

    从联机帮助复制:搜索条件
    是使用逻辑运算符 AND、OR 和 NOT 的一个或更多谓词的组合。语法
    < search_condition > ::=
        {    [ NOT ] < predicate > | ( < searth_condition > ) }
            [ { AND | OR } [ NOT ] { < predicate > |( < searth_condition > ) } ]
        }    [ ,...n ]< predicate > ::=
        {    expression { = | < > | != | > | > = | ! > | < | < = | ! < } expression
            | string_expression [ NOT ] LIKE string_expression
                [ ESCAPE 'escape_character' ]
            | expression [ NOT ] BETWEEN expression AND expression
            | expression IS [ NOT ] NULL
            | CONTAINS
                ( { column | * } , '< contains_search_condition >' )
            | FREETEXT ( { column | * } , 'freetext_string' )
            | expression [ NOT ] IN ( subquery | expression [ ,...n ] )
            | expression { = | < > | != | > | > = | ! > | < | < = | ! < } 
                { ALL | SOME | ANY} ( subquery )
            | EXISTS ( subquery ) 
        } 参数
    <search_condition>指定 SELECT 语句、查询表达式或子查询的结果集内所返回的行的条件。对于 UPDATE 语句,指定要更新的行。对于 DELETE 语句,指定要删除的行。对 Transact-SQL 语句搜索条件中可以包含的谓词数量没有限制。 NOT 
    对由谓词指定的布尔表达式求反。有关更多信息,请参见 NOT。AND 
    组合两个条件并在两个条件都是 TRUE 时取值为 TRUE。有关更多信息,请参见 AND。 OR 
    组合两个条件并在任何一个条件是 TRUE 时取值为 TRUE。有关更多信息,请参见 OR。 
    < predicate >是返回 TRUE、FALSE 或 UNKNOWN 的表达式。 expression 
    是列名、常量、函数、变量、标量子查询,或者是由运算符或子查询连接的列名、常量和函数的任意组合。该表达式还可以包含 CASE 函数。= 
    是用于测试两个表达式是否相等的运算符。<> 
    是用于测试两个表达式彼此不相等的条件的运算符。!= 
    是用于测试两个表达式彼此不相等的条件的运算符。> 
    是用于测试一个表达式大于另一个的条件的运算符。>= 
    是用于测试一个表达式大于或等于另一个的条件的运算符。!> 
    是用于测试一个表达式不大于另一个的条件的运算符。< 
    是用于测试一个表达式小于另一个的条件的运算符。<= 
    是用于测试一个表达式小于或等于另一个的条件的运算符。!< 
    是用于测试一个表达式不小于另一个的条件的运算符。string_expression 
    是字符串和通配符。[NOT] LIKE 
    表示对后续字符串使用模式匹配。有关更多信息,请参见 LIKE。ESCAPE 'escape_character' 
    允许在字符串中搜索通配符而不是将其作为通配符使用。escape_character 是放在通配符前表示此特殊用途的字符。[ NOT ] BETWEEN 
    指定值的包含范围。使用 AND 将开始值和结束值分开。有关更多信息,请参见 BETWEEN。IS [NOT] NULL 
    根据所使用的关键字指定对空值或非空值的搜索。如果有任何操作数是 NULL,带位运算符或算术运算符的表达式将取值为 NULL。CONTAINS 
    在包含基于字符的数据的列中,搜索单个词和短语的精确或"模糊"(不精确)匹配项、一定间距内的近似词以及加权匹配项。只能与 SELECT 语句一起使用。有关更多信息,请参见 CONTAINS。 FREETEXT 
    通过在包含基于字符的数据的列中,搜索与含义而不是谓词中的精确词相匹配的值,提供简单形式的自然语言查询。只能与 SELECT 语句一起使用。有关更多信息,请参见 FREETEXT。[ NOT ] IN 
    根据表达式是包含在列表内还是排除在列表外,指定对表达式的搜索。搜索表达式可以是常量或列名,而列表可以是一组常量或更多情况下是子查询。将值列表放在圆括号内。有关更多信息,请参见 IN。subquery 
    可被看成是受限 SELECT 语句且与 SELECT 语句中的 <query_expresssion> 相似。不允许使用 ORDER BY 子句、COMPUTE 子句和 INTO 关键字。有关更多信息,请参见 SELECT。 ALL 
    与比较运算符和子查询一起使用。如果子查询检索的所有值满足比较运算,将给 <predicate> 返回 TRUE,或者如果不是所有值都满足比较运算或子查询没有给外部语句返回行,则返回 FALSE。有关更多信息,请参见 ALL。{ SOME | ANY } 
    与比较运算符和子查询一起使用。如果子查询检索的任何值都满足比较运算,将给 <predicate> 返回 TRUE,或者如果子查询内没有值满足比较运算或子查询没有给外部语句返回行,则返回 FALSE。否则,表达式是未知的。有关更多信息,请参见 SOME | ANY。EXISTS 
    与子查询一起使用,测试由子查询返回的行是否存在。有关更多信息,请参见 EXISTS。 
    注释
    逻辑运算符的优先顺序是 NOT(最高),接着是 AND,最后是 OR。同一优先级上的取值顺序是从左到右。在搜索条件内,可使用圆括号替代此顺序。有关逻辑运算符如何在真实值上运算的更多信息,请参见 AND、OR 和 NOT。
      

  11.   

    要搞清楚
    表达式运算符的优先级

    逻辑表达式逻辑运算符和逻辑谓词的优先级
    的区别在where搜索条件使用逻辑表达式
      

  12.   

    由上到下,优先级由高到低,同行优先级一致,按在表达式中的顺序从左到右。
    1、+(正)、-(负)、~(按位 NOT)
    2、*(乘)、/(除)、%(模)
    3、+(加)、(+ 串联)、-(减)
    4、=,  >,  <,  >=,  <=,  <>,  !=,  !>,  !< 比较运算符
    5、^(位异或)、&(位与)、|(位或)
    6、NOT
    7、AND
    8、ALL、ANY、BETWEEN、IN、LIKE、OR、SOME
    9、=(赋值)另:虽然 or 和in 是在同一级,但Field1='1' or Field2 不构成有效逻辑表达式,所以Field2 in (Select Field1  From  testTable) 构成组合