从字符串数据中获取5位邮政编码

我有一个包含City,State Zip和Country的字符串。我已经能够将字符串中的城市和州放入单独的列中,但是遇到了将邮政编码拉出的问题。这是我从中提取数据的示例。

美国俄亥俄州哥伦布43219

我尝试过的代码是

Replace(LTRIM(RTRIM(LEFT(C.[BILLING_CITYSTATEZIP],CHARINDEX(',',C.[BILLING_CITYSTATEZIP])))),'')as City,left(LTRIM(RTRIM(SUBSTRING(C.[BILLING_CITYSTATEZIP],C.[BILLING_CITYSTATEZIP])+1,LEN(C.[BILLING_CITYSTATEZIP])-(CHARINDEX('',C.[BILLING_CITYSTATEZIP])-1)))),2)as State,dbo.udf_GetNumeric(Right(LTRIM(RTRIM(Substring(C.[BILLING_CITYSTATEZIP],C.[BILLING_CITYSTATEZIP]-1)))),2))as Zip,

我包括了我用来拉出City和State的代码,因为我将Zip代码的行从State行中镜像出来,但是我仍然收到下面的错误。我不知道我在哪里缺少ltrim的论点。任何的建议都受欢迎。

Msg 174,第15级,第1行,第36行 ltrim函数需要1个参数。 Msg 102,第15级,第1行,第52行 ','附近的语法不正确。

weishuai7894 回答:从字符串数据中获取5位邮政编码

您可以使用以下内容:

select case when patindex('% [0-9][0-9][0-9][0-9][0-9],%',c) > 0 then
SUBSTRING(c,patindex('% [0-9][0-9][0-9][0-9][0-9],c) + 1,5)
else '' end as zipCode
from
(
select 'Columbus,OH 43219,United States' as c
union all
select 'Chicago,IL 60626,United States' as c
) c
,

这是使用子字符串的一种方法:

DECLARE @address NVARCHAR(500) = 'Columbus,United States'

SELECT SUBSTRING(SUBSTRING(SUBSTRING(@address,CHARINDEX(',',@address) + 1,LEN(@address)),SUBSTRING(@address,LEN(@address)))),CHARINDEX(' ',SUBSTRING(SUBSTRING(@address,LEN(@address))))) + 1,LEN(@address))
,

对于“城市”,埋葬在这里

- (CHARINDEX('',C.[BILLING_CITYSTATEZIP])-1)

对于“邮编”,您在同一位置

 - (CHARINDEX('',C.[BILLING_CITYSTATEZIP]-1))

请注意,右括号是不同的。看来您需要将这两个之一移到“ -1”之前。

,

在处理复杂的字符串表达式时,APPLY是您最好的朋友。您可以使用它使您的代码更加DRYer( D 而不是 R 自己使用 Y )。这使代码更简洁,更易于调试。

DECLARE @BILLING_CITYSTATEZIP VARCHAR(200) = ' Columbus,United States ';

SELECT
  City    = SUBSTRING(f.String,a.Head,a.Pos-1),[State] = SUBSTRING(f.String,a.Pos+1,b.Pos-a.Pos-1),Zip     = SUBSTRING(f.String,b.Pos+1,c.Pos-b.Pos-1),Country = SUBSTRING(f.String,c.Pos+1,200) -- BONUS
FROM        (VALUES(RTRIM(LTRIM(REPLACE(REPLACE( -- All trimming (outer & inner) in 1 spot
             @BILLING_CITYSTATEZIP,'),'))))) AS f(String)
CROSS APPLY (VALUES(CHARINDEX(',f.String),1))            AS a(Pos,Head)
CROSS APPLY (VALUES(CHARINDEX(' ',f.String,a.Pos+1)))      AS b(Pos)
CROSS APPLY (VALUES(CHARINDEX(',b.Pos+1)))      AS c(Pos);

返回:

City        State    Zip     Country
----------- -------- ------- -----------------
Columbus    OH       43219   United States

针对一个表格,它看起来像这样:

DECLARE @table TABLE (SomeId INT IDENTITY,BILLING_CITYSTATEZIP VARCHAR(200));
INSERT  @table VALUES ('Columbus,United States'),('Chicago,IL 60625,United States')

SELECT t.SomeId,f.City,f.[State],f.[Zip],f.Country 
FROM   @table AS t
CROSS APPLY
(
  SELECT
    City    = SUBSTRING(f.String,200)
  FROM        (VALUES(RTRIM(LTRIM(REPLACE(REPLACE(
               t.BILLING_CITYSTATEZIP,'))))) AS f(String)
  CROSS APPLY (VALUES(CHARINDEX(',Head)
  CROSS APPLY (VALUES(CHARINDEX(' ',a.Pos+1)))      AS b(Pos)
  CROSS APPLY (VALUES(CHARINDEX(',b.Pos+1)))      AS c(Pos)
) AS f;

返回:

SomeId   City       State  Zip    Country
-------- ---------- ------ ------ ----------------
1        Columbus   OH     43219  United States
2        Chicago    IL     60625  United States
本文链接:https://www.f2er.com/3071440.html

大家都在问