从T-SQL列中提取帖子和地址

时间:2018-10-25 12:32:11

标签: sql-server tsql

我在sql表中有地址,我需要在单独的列中提取门号,地址和邮政编码

10 westminister way Road, London (NW10 5NQ)

列为;

Address => 19
road => westminister way Road
city => london
postcode => NW10 5NQ

我尝试了以下操作,但提取了邮政编码,因此在“选择”后从以下几行中提取邮政编码:“(NW10 5NQ' 这在postCode3的下一行中,当我尝试删除时(CHARINDEX('(',REVERSE([address]))-1从字符串中删除),sql抛出错误

错误

Invalid length parameter passed to the LEFT or SUBSTRING function.

SQL

select 
 ,REVERSE(SUBSTRING(REVERSE([address]),2,CHARINDEX('(', REVERSE([address])))) PostCode2
  ,REVERSE(SUBSTRING(REVERSE([address]),2, CHARINDEX('(', REVERSE([address]))-1 )) PostCode3
  ,CHARINDEX('(', REVERSE([address]))-2 index
上面的

index给我答案8,如果我遵循以下代码,它会按照我上面的要求给我正确的postCode,

  REVERSE(SUBSTRING(REVERSE([Land Description]),2, 8)) PostCode4     //==> answer ==>NW10 5NQ

我不确定这里缺少什么

1 个答案:

答案 0 :(得分:1)

您想要的SQL是:

REVERSE(SUBSTRING(REVERSE(@address),2, CHARINDEX('(', REVERSE(@address))-2))

您的“ postcode3”尝试很接近,但是您却莫名其妙地从子字符串的长度中减去了一个而不是两个,即使您在“ index”行中证明了减去两个结果的期望长度为8。

证明:

DECLARE @address varchar(255);

SET @address = '10 westminister way Road, London (NW10 5NQ)'



select 
 REVERSE(SUBSTRING(REVERSE(@address),3,CHARINDEX('(', REVERSE(@address)))) PostCode2
  ,REVERSE(SUBSTRING(REVERSE(@address),2, CHARINDEX('(', REVERSE(@address))-2)) PostCode3
  ,CHARINDEX('(', REVERSE(@address))-2 [index]

产生:

PostCode2   PostCode3   index
n (NW10 5N  NW10 5NQ    8