NVL,SUBSTR和RPAD语法

时间:2017-02-10 19:25:45

标签: sql oracle parsing substr nvl

我试图通过选择如下的值来创建固定宽度的文件:

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

2 个答案:

答案 0 :(得分: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'; 

答案 1 :(得分:0)

  1. 您不需要SUBSTRRPAD关键字已为您截断。

  2. 为您的NVL使用如下内容。如果housestreetstreettype的结尾为NULL,那么它将使用address1||address2

  3.     || NVL(
                RPAD(p.house||' '||p.street||' '||p.streettype,50,' ')
              , RPAD(address1||' '||address2,50,' ')
              )
    
    1. 更复杂的字符串解析,请阅读REGEXP_SUBSTRCASE WHEN

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

    4. 更强大