2017-03-02 62 views
0

我试图找到一种方法,将地址列拆分为两个以分隔街道号,街道名称,城市和州。拆分地址

SELECT distinct 
      OWNER, 
      ADDRESS, 

FROM vw_EMPLOYEE 

这给了我这样的

OWNER ADDRESS   
JOHN 10 HILL MIAMI FL 33139 
TONY 4545 BIRD AVE DORAL FL 33134 

这将是什么5倍不同的列拆分此列中的最佳选择的结果。 我正在读关于函数或子串,但我有点困惑,因为我还在学习有关SQL

+0

除非有明确的分隔符,否则解析这样的地址非常困难。为什么一个地址有一个状态,但另一个不是? – Barmar

+0

你应该修改你的表模式,为地址的每个部分分别设置一些列。那么你可能需要人类正确地重新输入数据。 – Barmar

+1

[* T-SQL(Transact Structured Query Language)是Sybase ASE和Microsoft SQL Server支持的SQL功能的扩展。 **不要将此标签用于MySQL,PostgreSql,Oracle(Pl/SQL)相关查询。***](http://stackoverflow.com/tags/tsql/info) – shmosel

回答

1

可以createfunction

CREATE FUNCTION SPLIT_STR(
    x VARCHAR(255), 
    delim VARCHAR(12), 
    pos INT 
) 
RETURNS VARCHAR(255) 
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), 
     CHAR_LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1), 
     delim, ""); 

查询:

select distinct 
      OWNER,prod_id,SPLIT_STR(ADDRESS,' ',1) as pos1 ,SPLIT_STR(ADDRESS,' ',2) as pos2, 
SPLIT_STR(ADDRESS,' ',3) as pos3 ,SPLIT_STR(ADDRESS,' ',4) as pos4,SPLIT_STR(ADDRESS,' ',5) as pos5 
from vw_EMPLOYEE 
0

分裂是很多容易当定界符是否存在。在SUBSTRINGPATINDEX的帮助下。

由于您的ADDRESS列没有类似的东西,所以您可以为此付费。这将首先转换为XML,然后从那里你可以在5个不同的列中实现值。

;WITH Split_Address (Owner,Address, xmladd) 
AS 
(
    SELECT Owner, 
    Address, 
    CONVERT(XML,'<Adrdress><Adrdress>' 
    + REPLACE(Adrdress,' ', '</Adrdress><Adrdress>') + '</Adrdress></Adrdress>') AS xmladd 
    FROM (select Adrdress,Owner from vw_EMPLOYEE)as t 
) 

SELECT Value,  
    xmlname.value('/Adrdress[1]/Adrdress[1]','varchar(100)') AS Adrdress1,  
    xmlname.value('/Adrdress[1]/Adrdress[2]','varchar(100)') AS Adrdress2, 
    xmlname.value('/Adrdress[1]/Adrdress[3]','varchar(100)') AS Adrdress3, 
    xmlname.value('/Adrdress[1]/Adrdress[4]','varchar(100)') AS Adrdress4, 
    xmlname.value('/Adrdress[1]/Adrdress[5]','varchar(100)') AS Adrdress5 
FROM Split_Address 
1

你可以使用this udfdetailed in this answer to your question通过空间地址字段拆分,然后与每个元素的工作。但是也有问题,这一点:

  • 你的地址并不一致(有一些其他国家不要) - 这是凌乱。
  • udf和sql不允许您轻松遍历地址中的每个单词,而不管地址中的单词数量(UDF要求您指定“单词编号”)。

如果我遇到了这个问题,我将使用脚本语言而不是SQL来分割和循环地址字段中的每个单词。继这样一个过程:

  1. 来源邮编列表插入表中。

  2. 将状态和状态缩写列表输入表中。

  3. 将城市列表转换为表格。

  4. 将道路名称和缩写列表输入表格(例如road,rd,street,st)。

  5. 通过分割空间中的地址,然后从最后一个地址字循环到第一:

    一个。如果该单词存在于邮政编码表中,那么这就是邮政编码。如果已经为当前地址确定了一个邮政编码,则会报错。

    b。否则,如果这个单词存在于状态表中,那么这就是状态。如果一个状态已经被识别为当前地址,那么错误。

    c。否则,如果这个词在城市名称表中存在,那么这个城市就是这样。如果一个城市已经被识别为当前地址,那么错误。 d)。否则,如果该词存在于道路名称表中,则当前单词和所有先前的单词将假定为地址线。

    e。在广告中列出的的if/else块之外,如果邮政编码,州和城市都确定了当前地址,再假设剩余的词构成的地址线1

上述过程会给你一个开始一个有问题的清洁之旅。

你可能需要解决一些其他问题:

  • 如果地址正好有“”您可能需要带他们实地分隔条件的元素。例如:10 HILL迈阿密,佛罗里达州,33139
0

我觉得也不能保证你总是有5节。像123 Santa Rosa Blvd. CA 91035这样的地址有六个部分。

在之前第一空间一般

  1. 一切,可以是NUMBER
  2. 最后空间之前
  3. 什么都可以ZIPCODE
  4. 删除这些两个部分后,您将有最后的2个字符作为国家
  5. 其余的将是STREET。

希望这会引导你一个算法。

0

谢谢大家的反馈意见。所有的回应都帮助了我,让我走向了正确的方向。我认为最好的是创造功能。