如何格式化Zip -code(XXXXX-XXXX)for country USA?

时间:2016-01-08 15:44:04

标签: sql oracle plsql

要求在下面给出的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

4 个答案:

答案 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