要求在下面给出的oracle视图中在屏幕上显示格式化的美国邮政编码,只有在国家/地区代码为美国且邮政编码长度为9位时,邮政编码才应格式化为XXXXX-XXXX。 / p>
CREATE OR REPLACE VIEW PARTY_ADDR
AS
SELECT ZIP_CODE AS ZIP_POSTAL_CODE,COUNTRY_CD,ADDRESS_LINE_1
FROM PARTY
答案 0 :(得分:1)
首先,我会假设该字段是varchar,因为许多国家的邮政编码是数字和字母的混合。
因此,如果您坚持在查询中执行此操作,请执行以下操作:
SELECT CASE WHEN country_code = 'US' and length(postal_code) = 9
THEN substr(postal_code,1,5)||'-'||substr(postal_Code(6,4)
else postal_Code
end as disply_postal_Code
from your_Table
答案 1 :(得分:0)
REGEXP_REPLACE()来救援!当然,添加国家代码的其他WHERE子句标准等。
SQL> with tbl(zip) as (
select '12345' from dual union
select '12345-1234' from dual
)
select REGEXP_REPLACE(ZIP,'(\d{5})(\d{4})','\1-\2') ZIP
from tbl;
ZIP
------------------------------------------------------------
12345
12345-1234
SQL>
请注意,应该提到一个可能的警告。这是有效的,因为如果长度是9位数,它会分为2组,5个中的一个和4个中的一个,并在它们之间用短划线显示。其他任何东西和正则表达式都不匹配,因此返回原始字符串,包括错误数据。将更多测试数据添加到WITH子句,并首先对数据进行一些健全性检查,以查看是否有任何需要清理的错误数据。无论如何我要做的好事。
答案 2 :(得分:0)
只是另一种选择。我们也可以使用OLDSCHOOL而不是REGEXP 方法:P像SUBSTR,因为我们只需格式化基于美国的拉链。就像你一样 已经规定,美国的拉链仅为9位,因此基于此 这段代码也会对你有帮助。
WITH tbl AS
( SELECT '12345' ZIP,'IN' country FROM dual
UNION
SELECT '123451234' ZIP, 'US' country FROM dual
UNION
SELECT '123456' zip,'KR' country FROM dual
)
SELECT DECODE(TBL.country,'US',SUBSTR(tbl.zip,1,5)
||'-'
||SUBSTR(tbl.zip,6,LENGTH(tbl.zip)),TBL.ZIP) zip_formatted
FROM tbl ;
--------------------------------OUTPUT---------------------------------------------
DECODE(TBL
----------
12345
12345-1234
123456
Elapsed: 00:00:06.17
-----------------------------------------------------------------------------------
答案 3 :(得分:0)
这是我使用的代码,每次都运行良好。
'ZipCode' = case LEN(LTRIM(RTRIM(zipcode)))
when 9 then
STUFF(zipcode, 6, 0, '-')
else zipcode
end