我在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.
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
我不确定这里缺少什么
答案 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