我试图通过选择如下的值来创建固定宽度的文件:
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 :(得分: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)
您不需要SUBSTR
。 RPAD
关键字已为您截断。
为您的NVL
使用如下内容。如果house
,street
,streettype
的结尾为NULL
,那么它将使用address1||address2
|| NVL(
RPAD(p.house||' '||p.street||' '||p.streettype,50,' ')
, RPAD(address1||' '||address2,50,' ')
)
更复杂的字符串解析,请阅读REGEXP_SUBSTR
和CASE WHEN
如果您要处理几个可能的NULL
列,请使用COALESCE
;它比NVL