首页 > 解决方案 > 从 t-sql 中的列中提取帖子和地址

问题描述

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

10 westminister way Road, London (NW10 5NQ)

列为;

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

我尝试了以下但提取邮政编码,所以在'select' PostCode之后的以下行中给了我'(NW10 5NQ',在postCode3的下一行中,当我尝试删除时,sql抛出错误(来自CHARINDEX的字符串('(' ,反向([地址]))-1)

错误

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

上面的索引给了我答案 8,如果我执行以下代码,它会按照我上面的要求给我正确的 postCode,

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

我不确定我在这里缺少什么

标签: sql-servertsql

解决方案


你想要的 SQL 是:

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

您的“postcode3”尝试很接近,但您莫名其妙地从子字符串的长度中减去了一个而不是两个,即使在您的“索引”行中,您证明减去两个会导致所需的长度为 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

推荐阅读