相同的MySQL查询但不同的输出 - 为什么?

时间:2012-07-11 04:37:10

标签: mysql or-operator

我在书中使用了相同的查询。那么,为什么我的输出与书中的输出有很大的不同? 该书还说“||运算符不会导致字母数字值的串联,但它被视为组合谓词的OR运算符”。 “组合谓词的OR运算符”是什么意思?

  • 数据库:网球
  • table:player
  • 列:playerno(pk),城镇,街道,houseno ......等。

  • 问题: 获取居住在斯特拉特福的每位球员的球员号码和地址

  • 查询:

    select playerno, town || '' || street || '' || houseno
    from players 
    where town = 'stratford';
    
  • Book的结果:

    2   Stratford Stoney Road 43
    6   Stratford Haseltine lane 80
    

......等

  • 我的结果(使用相同的查询):

    2   1
    6   1
    7   1
    39  1
    57  1
    83  1
    100 1 
    

2 个答案:

答案 0 :(得分:1)

因为,按照书中的说法,如果他们使用了sql模式PIPES_AS_CONCAT,那么你的管道将作为连接运算符。

SET sql_mode='PIPES_AS_CONCAT';
select playerno, town || '' || street || '' || houseno
from players 
where town = 'stratford';

将为您提供书中所示的输出:)

答案 1 :(得分:0)

在MySQL中,您必须使用CONCAT()将列的值放在一个字符串中:

SELECT playerno, CONCAT(town, ' ', street, ' ', houseno)
FROM   players 
WHERE  town = 'stratford';

您的书可能是指使用||来连接字符串的Oracle concatenation语法。默认情况下,MySQL将||视为两个或多个条件之间的OR运算符,如果其中任何一个计算为“true”,则返回1

但正如satdev86的回答所述,如果手动模式||,MySQL 允许PIPES_AS_CONCAT仅作为连接运算符使用在执行查询之前设置。


编辑:

在您的书中,它明确指出您必须设置MySQL sql_mode才能使示例正常工作。它位于SQL示例之前的页面上:

http://books.google.com/books?id=c5G42OHT96cC&pg=PT160&lpg=PT160&dq=%22This+specification+is+needed+for+the+following+examples.+It+applies+only+to+the+current+session.%22&source=bl&ots=6b6zeFbM-2&sig=3a54S4vbgmKbPBqVbbR8OdxLLI8&hl=en&sa=X&ei=Nwz9T6fKAcfI2gWZhfDTBg&ved=0CCEQ6AEwAA