2017-02-10 72 views
0

我试图通过选择像这样的值来创建一个固定宽度的文件:NVL,SUBSTR和RPAD语法

SELECT distinct SubStr(RPad(InitCap(p.namelast),50,' '),1,50) 
|| SubStr(RPad(InitCap(p.namefirst),50,' '),1,50) 
|| SubStr(RPad(p.house ||' ' || p.street || ' ' ||p.streettype,50,' '),1,50) 
||'             ' 
||SubStr(RPad(InitCap(p.city),35,' '),1,35) 
||NVL(SubStr(RPad(p.province,2,'0'),1,2),' ') 
||NVL(SubStr(RPad(p.postal,5,'0'),1,5),'  ') 

上述工作正常。但是,我还需要考虑地址将在我上面的字段(p.house,p.street,p.streettype ...)中解析或者在ADDRESS1和ADDRESS2中找到的事实。 ADDRESS 2然而包含城市状态和zip,并且需要被解析。

我可以通过使用NVL来实现吗?我觉得如果我使用一个NVL和SUBSTR我需要的值,它可以工作。但我不确定语法。在ADDRESS1和ADDRESS2

数据分别如下:

123 boom drive|MONTGOMERY AL 45777 

回答

0

我注意到知道你是问什么,但如果这是关于持续格式化所有这些列,一个办法是格式列而不是使用子集和填充。例如:

column Address1 format a20 ; 
column Address2 format a20 ; 
column aliased-column format a20; 

这使您的select语句更加清洁,更易于维护。获得更多花哨,你可以创建一个脚本,动态格式化表中的列。例如:

select 'column ' || table_name || ' format a20; ' from all_tables where lower(owner) = 'scott'; 
0
  1. 你不需要SUBSTRRPAD关键字已经为您截断。

  2. 为您的NVL使用类似以下内容。如果housestreet的concat,则streettypeNULL然后它将使用address1||address2

|| NVL(
      RPAD(p.house||' '||p.street||' '||p.streettype,50,' ') 
      , RPAD(address1||' '||address2,50,' ') 
     ) 
  • 对于更复杂的字符串解析,读取REGEXP_SUBSTRCASE WHEN甲骨文引用

  • 如果您正在处理几个可能的NULL列,然后使用COALESCE;它比NVL更加强大