0

我正在尝试通过选择如下值来创建一个固定宽度的文件:

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
4

2 回答 2

1

我注意到您的要求,但如果这是关于一致地格式化所有这些列,一种方法是格式化列而不是使用子集和填充。例如:

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'; 
于 2017-02-10T22:08:21.093 回答
0
  1. 你不需要SUBSTR。关键字已经为RPAD您截断。

  2. 供您NVL使用,如下所示。house如果, street,的 concatstreettypeNULL那么它将使用address1||address2

    || NVL(
            RPAD(p.house||' '||p.street||' '||p.streettype,50,' ')
          , RPAD(address1||' '||address2,50,' ')
          )
  1. 对于更复杂的字符串解析,请阅读 OracleREGEXP_SUBSTR参考资料CASE WHEN

  2. 如果您要处理几个可能的NULL列,请使用COALESCE; 它比NVL

于 2018-02-13T03:45:39.253 回答