0

我正在编写一个 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
4

2 回答 2

1

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

选择地址1 || 从表中解码(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

于 2012-05-16T20:32:21.560 回答
0

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

于 2012-05-30T18:48:08.710 回答