Oracle SQLPlus报告中的复杂TTITLE表达式

时间:2012-05-16 20:09:16

标签: oracle reporting sqlplus

我正在撰写一份SQLPlus报告,其中定期标题包含业务地址,后面是关于该业务的几个相关行,后面是下一个业务的地址:

BOB'S GUITARS 
123 SESAME STREET 
NEW YORK, NY 10001

customer name   last purchase date   last purchase amount
-------------   ------------------   --------------------

DAVE'S CIGARS 
456 MOCKINGBIRD LANE 
WASHINGTON, DC 12345

customer name   last purchase date   last purchase amount
-------------   ------------------   --------------------

问题在于:

其中一些企业拥有多行地址,而其他企业则没有。

我可以用类似的东西处理基本情况 TTITLE CENTER BUSINESSNAME SKIP 1 CENTER ADDR1 SKIP 1 CENTER CITY

(其中“CITY”是包含城市,州和邮政编码的变量)

但是我很难弄清楚如果ADDR2不为空而“添加第二个地址行”,而不会冒ADDR1和CITY之间的空白线。

换句话说,我不想要

BOB'S GUITARS
123 SESAME STREET

NEW YORK, NY 10001

为了支持

DAVE'S CIGARS
456 MOCKINGBIRD LANE
SUITE 101
WASHINGTON, DC 12345

编辑/添加: nvl和decode相结合的建议是正确的第一步,但现在我遇到了问题,即所讨论的两行“行”超出了报告的LINEWIDTH,因此被截断为LINEWIDTH字符。这是我用来生成该行的代码。请记住,两行必须居中:

SELECT RPAD(' ', (79 - length(trim(address)))/2) 
  || trim(address) 
  || decode(nvl(trim(address_2), '='), '=', '', 
    CHR(10) 
    || RPAD(' ', (79 - length(trim(address_2)))/2, '-') 
    || trim(address_2) || ' ') ADDR1 from business

2 个答案:

答案 0 :(得分:1)

假设您可以定义地址变量,如果存在addr_2,则该变量将包含addr_1或addr1 + addr_2。这将是此变量的选择:

选择addr1 ||从表中解码(nvl(addr_2,'='),'=','',CHR(10)|| addr_2)

CHR(10)是换线!!


试图完成我的建议。 (您不需要手动处理填充)

您需要定义一个列并在select和temp变量中使用别名

COLUMN NEW_ADDR new_value N_ADDR noprint
TTITLE CENTER BUSINESSNAME SKIP 1 CENTER N_ADDR SKIP 1 CENTER CITY
-- I suppose you have some break on businessname command here 
BREAK ON BUSINESSNAME ON NEW_ADDR .... 
SELECT ...., ADDRESS || DECODE (NVL(ADDRESS_2,'='),'=','',CHR(10)||ADDRESS_2) AS NEW_ADDR  FROM BUSINESS

我还建议您查看http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch6.htm

答案 1 :(得分:0)

在考虑了文档和分析后,似乎无法做到这一点。 (非技术性)解决方案是按业务所有者接受SQL * Plus实际可生成的格式。他们对这个解决方案感到满意。