我有一个地址字段,其中所有地址详细信息都保存在一列中,我想创建一些标签,因此需要能够将地址拆分为正确的格式。 示例: -
ADDRESS
PIKE ROAD, AL 36064-3401
MEMPHIS TN 38104-5802
JAMAICA PLAIN MA 02130-2337
需要将此列拆分为
City State Zip
PIKE ROAD AL 36064-3401
MEMPHIS TN 38104-5802
JAMAICA PLAIN MA 02130-2337
我可以使用
提取邮政编码STUFF(Address, 1, Len(Address) +1- CHARINDEX(' ',Reverse(Address)), '') from abx
但我在提取城市和州方面遇到了麻烦。是否有可能根据单词的长度分割字符串,即单词(2)的长度前的所有字符进入City,所有带有2个字符的单词进入状态示例: - Pike Road进入城市并且AL(长度为2)处于状态?
答案 0 :(得分:2)
这适用于这三个例子。正如@Kevin在上面指出的那样,如果您的数据一致,这是有效的,正如他所说,“这是一个非常大的问题。”
我所做的是创建一个模仿表格的子查询。它有一列“x”,只有一个字符串值。我向前工作以获得邮政编码(你想出来的),然后是州,然后是街道地址。用于提取基于前一个信息的每条信息的函数。
我多年没有使用过SQL Server,所以我使用了web app designed to mimick SQL Server 2014。
此查询应该在下面的屏幕截图中生成表格:
select x
, REPLACE(SUBSTRING(x, 1, LEN(x) - CHARINDEX(' ', REVERSE(x), CHARINDEX(' ', REVERSE(x)) + 1)), ',', '') as city
, SUBSTRING(x, LEN(x) - CHARINDEX(' ', REVERSE(x), CHARINDEX(' ', REVERSE(x)) + 1) + 2, 2) as state
, SUBSTRING(x, LEN(x) + 2 - CHARINDEX(' ', REVERSE(x)), CHARINDEX(' ', REVERSE(x))) as zip
FROM (
select 'PIKE ROAD, AL 36064-3401' as x
union
select 'MEMPHIS TN 38104-5802'
union
select 'JAMAICA PLAIN MA 02130-2337'
) as whatever
HTH!
干杯,
-Maashu
答案 1 :(得分:1)
你可以做这样的事情,如果你的数据是一致的,它会起作用。那是一个非常大的IF ...
DECLARE @ADDRESS NVARCHAR(255) = 'PIKE ROAD, AL 36064-3401'
DECLARE @DELIMITER CHAR(1) = ' '
DECLARE @POS INT
DECLARE @ZIP NVARCHAR(11)
DECLARE @STATE NVARCHAR(11)
DECLARE @CITY NVARCHAR(200)
-- get the occurrence of the last space
SET @POS = LEN(@ADDRESS) - CHARINDEX(@DELIMITER,REVERSE(@ADDRESS))
--set the zip code
SET @ZIP = SUBSTRING(@ADDRESS, @POS+2, 11)
--get the remaining portion of the address
SET @ADDRESS = SUBSTRING(@ADDRESS, 0, @POS+1)
--set the last space again
SET @POS = LEN(@ADDRESS) - CHARINDEX(@DELIMITER,REVERSE(@ADDRESS))
--set the state and street
SET @STATE = SUBSTRING(@ADDRESS, @POS+2, 11)
SET @CITY = SUBSTRING(@ADDRESS, 0, @POS)
PRINT @ZIP
PRINT @STATE
PRINT @CITY
输出:
36064-3401
AL
PIKE ROAD
答案 2 :(得分:0)
正如@Habo所说,您只需要使用LEN
和SUBSTRING
。
WITH Tbl AS(
SELECT * FROM (VALUES
('PIKE ROAD, AL 36064-3401'),
('MEMPHIS TN 38104-5802'),
('JAMAICA PLAIN MA 02130-2337')
) t(Address)
)
SELECT
City = SUBSTRING(Address, 0, LEN(Address) - 13),
State = SUBSTRING(Address, LEN(Address) - 12, 2),
ZipCode = SUBSTRING(Address, LEN(Address) - 9, 10)
FROM Tbl