我正在撰写一份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
答案 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实际可生成的格式。他们对这个解决方案感到满意。