none
SQL Server运算符的优先级问题 RRS feed

  • 问题

  • SQL SERVER2005的Transact-SQL帮助里说比较运算符的优先级高于位异或(^)和位或(|)运算符,如果是这样,下面表达式的运算结果是什么呢?
                             3^5>5
    如果>的级别高于^,那么应该先进行比较运算5>5,结果为false,然后进行3^false的运算导致由于类型不匹配而报错。但实际上上述表达式的运算结果为true,即先进行了3^5的运算,得到运算结果6,然后6>5得到true。
    请问究竟是SQL Server的帮助里对运算符优先级的解释有问题,还是我的理解有问题。请各位大虾赐教!
    2010年5月31日 4:06

答案

  • Bookonline 上写得很清楚

    http://technet.microsoft.com/zh-cn/library/ms190276.aspx

    当一个复杂的表达式有多个运算符时,运算符优先级决定执行运算的先后次序。执行的顺序可能严重地影响所得到的值。

    运算符的优先级别如下表中所示。在较低级别的运算符之前先对较高级别的运算符进行求值。

    级别 运算符

    1

    ~(位非)

    2

    *(乘)、/(除)、%(取模)

    3

    +(正)、-(负)、+(加)、(+连接)、-(减)、&(位与)、^(位异或)、|(位或)

    4

    =, >, <, >=, <=, <>, !=, !>, !< (比较运算符)

    5

    NOT

    6

    AND

    7

    ALL、ANY、BETWEEN、IN、LIKE、OR、SOME

    8

    =(赋值)

    当一个表达式中的两个运算符有相同的运算符优先级别时,将按照它们在表达式中的位置对其从左到右进行求值

    2010年5月31日 4:30

全部回复

  • Bookonline 上写得很清楚

    http://technet.microsoft.com/zh-cn/library/ms190276.aspx

    当一个复杂的表达式有多个运算符时,运算符优先级决定执行运算的先后次序。执行的顺序可能严重地影响所得到的值。

    运算符的优先级别如下表中所示。在较低级别的运算符之前先对较高级别的运算符进行求值。

    级别 运算符

    1

    ~(位非)

    2

    *(乘)、/(除)、%(取模)

    3

    +(正)、-(负)、+(加)、(+连接)、-(减)、&(位与)、^(位异或)、|(位或)

    4

    =, >, <, >=, <=, <>, !=, !>, !< (比较运算符)

    5

    NOT

    6

    AND

    7

    ALL、ANY、BETWEEN、IN、LIKE、OR、SOME

    8

    =(赋值)

    当一个表达式中的两个运算符有相同的运算符优先级别时,将按照它们在表达式中的位置对其从左到右进行求值

    2010年5月31日 4:30
  • 我觉得我发现了问题的所在,大家可以尝试访问以下两个不同的网址:
    第一个:http://msdn.microsoft.com/zh-cn/library/ms190276(v=SQL.90).aspx
    第二个:http://msdn.microsoft.com/zh-cn/library/ms190276.aspx
    前面一个是SQL Server 2005的联机帮助里关于运算符优先级的解释,后面一个是SQL Server 2008的联机帮助里关于运算符优先级的解释。两者的区别恰恰就是位异或(~)和位或(|)两个运算符的优先级发生了变化,2005帮助里将这两个运算符的优先级单独设为5级,而2008帮助里将它们的优先级设为了3级。
    不知道这两个是都对呢,还是确实2005帮助出了一些小问题,总之我在2005版本中测试的结果支持2008对于运算符优先级的解释。
    从网址上看,2005帮助的网址中多了"v=SQL.90",2008则没有,是不是与SQL 90标准有关呢,不得而知。总之,谢谢楼主了!
    2010年5月31日 7:23
  • 我觉得我发现了问题的所在,大家可以尝试访问以下两个不同的网址:
    第一个:http://msdn.microsoft.com/zh-cn/library/ms190276(v=SQL.90).aspx
    第二个:http://msdn.microsoft.com/zh-cn/library/ms190276.aspx
    前面一个是SQL Server 2005的联机帮助里关于运算符优先级的解释,后面一个是SQL Server 2008的联机帮助里关于运算符优先级的解释。两者的区别恰恰就是位异或(~)和位或(|)两个运算符的优先级发生了变化,2005帮助里将这两个运算符的优先级单独设为5级,而2008帮助里将它们的优先级设为了3级。
    不知道这两个是都对呢,还是确实2005帮助出了一些小问题,总之我在2005版本中测试的结果支持2008对于运算符优先级的解释。
    从网址上看,2005帮助的网址中多了"v=SQL.90",2008则没有,是不是与SQL 90标准有关呢,不得而知。总之,谢谢楼主了!

    在CSDN回过同样的贴子
    2010年6月4日 0:55