从地址解析信息

时间:2013-08-08 18:19:33

标签: sql-server-2008 tsql

我目前有一个可能看起来像这样的地址。

5235 Georgia Street Apt 8
436 Oregon Avenue Apartment # 5
... etc

我有一个名为Address_length的表,其中包含2个地址列(address_1和address_2) address_2应该包含公寓信息。

使用address_1中的一串信息更新address_2的最简单方法是什么。 如果我看到Apt或Apartment这个词,我想在该栏中包含该词及其中的所有内容。

所以使用上面的例子,输出看起来像这样。

address_1              address_2
5235 Georgia Street    Apt 8
436 Oregon Avenue      Apartment # 5

任何帮助或想法都将不胜感激。

1 个答案:

答案 0 :(得分:2)

好的,这很难。我会创建一个表格,其中包含代表公寓的不同字符串,如下所示:

INSERT INTO ApartmentsStrings
VALUES (N'apt'),(N'apartment');

然后我会做以下事情:

SELECT  A.[Address] OriginalAddress,
        CASE WHEN B.Position IS NOT NULL 
        THEN LEFT(A.[Address],B.Position-1) 
        ELSE A.[Address] END Address_1,
        CASE WHEN B.Position IS NOT NULL 
        THEN SUBSTRING(A.[Address],B.Position,LEN(A.[Address])-B.Position+1) END Address_2
FROM Address A
OUTER APPLY(SELECT PATINDEX('%'+String+'%',A.[Address]) Position
            FROM ApartmentsStrings
            WHERE PATINDEX('%'+String+'%',A.[Address]) > 0) B

结果:

╔═════════════════════════════════╦══════════════════════╦═══════════════╗
║         OriginalAddress         ║      Address_1       ║   Address_2   ║
╠═════════════════════════════════╬══════════════════════╬═══════════════╣
║ 5235 Georgia Street Apt 8       ║ 5235 Georgia Street  ║ Apt 8         ║
║ 436 Oregon Avenue Apartment # 5 ║ 436 Oregon Avenue    ║ Apartment # 5 ║
╚═════════════════════════════════╩══════════════════════╩═══════════════╝

当定义公寓的字符串包含在另一个字符串中时,您将有重复项(即:apartapartment)。还有很大的误报可能性,这意味着您可以拥有包含apt的地址,但这并不代表公寓。

Here is an sqlfiddle给你试试。