【问题标题】:BREAK ON instruction in MySQL queries?MySQL查询中的BREAK ON指令?
【发布时间】:2015-08-26 22:03:38
【问题描述】:

我想使用适用于 Oracle 的 MySQL (v. 5.5.41) 执行该查询:

CLEAR BREAKS;
BREAK ON mq;

SELECT mq, im, pf, kmct 
FROM vehicules 
WHERE mq='Renault' 
ORDER BY mq;

CLEAR BREAKS;

这是 Oracle 构建的输出,以及我在 MySQL 中寻找的内容:

mq       | im          | pf   | kmct
---------+-------------+------+----------
Renault  | AA-888-AA   | 4    | 3424
---------+-------------+------+----------
         | AA-999-AA   | 2    | 2042
---------+-------------+------+----------
         | BB-888-BB   | 3    | 1580

我得到的错误是:

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“CLEAR BREAKS”附近使用正确的语法

似乎在 MySQL 中没有实现命令“BREAK”。真的吗?那么,有没有办法模拟呢?

【问题讨论】:

  • 我想你在找LEAVE,看看here
  • 不,我正在寻找一条指令,通过避免单元格中的项目重复,使表格成为 DBMS 的输出表格。在我的例子中,我会得到几行“雷诺”作为所有行的第一个单元格的内容。打破MQ;在 Oracle 中只会将“Renault”放在 [1][1] 单元格上,并让所有 [1][2-n] 单元格为空。我将编辑我的帖子以避免任何误解。无论如何,谢谢你的回答。

标签: mysql sql


【解决方案1】:

MySQL 不支持BREAK ON。 AFAIK 它是 ORACLE 中的 reporting style 命令。

要获得所需的输出,您必须记住先前读取的行的列值并与下一行的列中读取的值进行比较。当它们匹配时,您可以设置一个空字符串作为输出,否则保留新值。

示例

SELECT 
       ( CASE WHEN @prev_mq != mq THEN @prev_mq := mq ELSE '' END ) AS mq
     , im, pf, kmct 
  FROM vehicules, ( SELECT @prev_mq := '' ) AS initializer
 WHERE mq = 'Renault' 
-- ORDER BY mq;

ORDER BY mq 的使用在这里没有任何意义。因为,当您用空字符串替换重复出现时,ORDER BY 会导致意外结果。

【讨论】:

  • 请参考stackoverflow.com/questions/1241856/…。它可能会有所帮助。
  • 我有#1267 - Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '<>',我只需要写( CASE WHEN @prev_mq != mq COLLATE 'utf8_general_ci' THEN @prev_mq := mq ELSE '' END )而不是你的CASE。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多