代码之家  ›  专栏  ›  技术社区  ›  yukondude

除了SQL*Plus中指定的列之外,是否还可以在其他列上断开?

  •  3
  • yukondude  · 技术社区  · 15 年前

    这一点很难解释,所以我将尝试在使用示例后展示我的想法。请注意,我不是在问是否可以在一个文档中使用多个列 BREAK 声明——我知道是这样。

    SELECT  invoice_no, invoice_date, vendor, account, amount
    FROM    invoice
    ORDER   BY vendor, invoice_no, account
    

    假设结果集为:

    INVOICE_NO INVOICE_DATE VENDOR  ACCOUNT AMOUNT
    ---------- ------------ ------- ------- ------
    0001       30-JAN-2009  Alpha   1000     50.00
    0003       30-JAN-2009  Alpha   1000    125.00
    0003       30-JAN-2009  Alpha   3000     33.33
    0006       02-FEB-2009  Alpha   2000     40.00
    0005       31-JAN-2009  Bravo   1000     40.00
    0002       30-JAN-2009  Charlie 2000    120.75
    0002       30-JAN-2009  Charlie 3000      5.00
    0004       30-JAN-2009  Charlie 1000    900.50
    

    因此,您可以看到一些供应商有多个发票,而一些发票有多个帐户。

    要隐藏重复的供应商名称和发票号,我可以使用SQL*Plus BREAK 像这样的命令:

    BREAK ON vendor ON invoice_no
    

    INVOICE_NO INVOICE_DATE VENDOR  ACCOUNT AMOUNT
    ---------- ------------ ------- ------- ------
    0001       30-JAN-2009  Alpha   1000     50.00
    0003       30-JAN-2009          1000    125.00
               30-JAN-2009          3000     33.33
    0006       02-FEB-2009          2000     40.00
    0005       31-JAN-2009  Bravo   1000     40.00
    0002       30-JAN-2009  Charlie 2000    120.75
               30-JAN-2009          3000      5.00
    0004       30-JAN-2009          1000    900.50
    

    BREAK ON vendor ON invoice_no ON invoice_date
    

    它会走得太远,并隐藏发票0003和0004的日期,因为它们与各自供应商以前的发票相同:

    INVOICE_NO INVOICE_DATE VENDOR  ACCOUNT AMOUNT
    ---------- ------------ ------- ------- ------
    0001       30-JAN-2009  Alpha   1000     50.00
    0003                            1000    125.00
                                    3000     33.33
    0006       02-FEB-2009          2000     40.00
    0005       31-JAN-2009  Bravo   1000     40.00
    0002       30-JAN-2009  Charlie 2000    120.75
                                    3000      5.00
    0004                    Charlie 1000    900.50
    

    我真正想要的是像下面这样的命令语法(这个术语是我编的 AND ):

    BREAK ON vendor ON invoice_no AND invoice_date
    

    INVOICE_NO INVOICE_DATE VENDOR  ACCOUNT AMOUNT
    ---------- ------------ ------- ------- ------
    0001       30-JAN-2009  Alpha   1000     50.00
    0003       30-JAN-2009          1000    125.00
                                    3000     33.33
    0006       02-FEB-2009          2000     40.00
    0005       31-JAN-2009  Bravo   1000     40.00
    0002       30-JAN-2009  Charlie 2000    120.75
                                    3000      5.00
    0004       30-JAN-2009  Charlie 1000    900.50
    

    现在,发票0003和0004的日期已正确显示。

    在SQL*Plus中有什么方法可以实现这一点吗?

    3 回复  |  直到 15 年前
        1
  •  4
  •   Mayur Birari    12 年前

    你想要这样的东西:

    列虚拟NOPRINT
    发票号上供应商的虚拟中断
    选择CONCAT(供应商、发票号)、虚拟、发票号、发票日期、供应商、帐户、金额

    按供应商、发票号、账户排序的订单

    您正在设置 column DUMMY 未打印 然后在select中将其定义为需要检查的两个字段的串联。

    “额外的” ON vendor ON invoice_no “允许您控制与虚拟中断分开的COL上的DUP。类似地,您可以使用 DUMMY 得到总数等。

        2
  •  2
  •   Alex Martelli    15 年前

    你可以 BREAK ON 一个表达式,通过将感兴趣的字段转换为字符串并用 || 你应该能够组合一个表达式,让你打破“他们的两个价值观”。

        3
  •  1
  •   yukondude    15 年前

    SQL*Plus似乎无法做到这一点。我最终使用了 sed 要在发票编号为空时删除发票日期,请执行以下操作:

    sed -re 's/^( {11})[0-9A-Z-]{11}(.+)$/\1           \2/'