4

我有一组地址:

34 Main St Suite 23
435 Center Road Ste 3
34 Jack Corner Bldg 4
2 Some Street Building 345

分隔符是:

Suite, Ste, Bldg, Building

我想将这些地址分成address1这样的address2

+---------------------+--------------+
|      Address1       |   Address2   |
+---------------------+--------------+
| 34 Main St          | Suite 23     |
| 435 Center Road     | Ste 3        |
| 34 Jack Corner      | Bldg 4       |
| 2 Some Street       | Building 345 |
+---------------------+--------------+

如何以这种方式定义一组分隔符和分隔符?

4

4 回答 4

4
SELECT
   T.Address,
   Left(T.Address, IsNull(X.Pos - 1, 2147483647)) Address1,
   Substring(T.Address, X.Pos + 1, 2147483647) Address2 -- Null if no second
FROM
   (
      VALUES
      ('34 Main St Suite 23'),
      ('435 Center Road Ste 3'),
      ('34 Jack Corner Bldg 4'),
      ('2 Some Street Building 345'),
      ('123 Sterling Rd'),
      ('405 29th St Bldg 4 Ste 217')
   ) T (Address)
   OUTER APPLY (
      SELECT TOP 1 NullIf(PatIndex(Delimiter, T.Address), 0) Pos
      FROM (
         VALUES ('% Suite %'), ('% Ste %'), ('% Bldg %'), ('% Building %')
      ) X (Delimiter)
      WHERE T.Address LIKE X.Delimiter 
      ORDER BY Pos
   ) X

我使用PatIndex()了像“Sterling Rd”这样的地址不会在“Ste”上给你一个错误的匹配

结果集:

Address1         Address2
---------------  --------
34 Main St       Suite 23
435 Center Road  Ste 3
34 Jack Corner   Bldg 4
2 Some Street    Building 345
123 Sterling Rd  NULL
405 29th St      Bldg 4 Ste 217
于 2012-07-25T20:45:16.120 回答
1

您可以使用分隔符表来执行拆分。在此示例中,我使用 XML 进行解析,但是在您使用可靠的分隔符代替您的集合(Ste、Suite 等)之后,您可以使用许多基于 t-sql 的方法中的任何一种来执行拆分.

declare @tab table (s varchar(100))
insert into @tab
    select '34 Main St Suite 23' union all
    select '435 Center Road Ste 3' union all
    select '34 Jack Corner Bldg 4' union all
    select '2 Some Street Building 345' union all
    select '20950 N. Tatum Blvd., Ste 300' union all
    select '1524 McHenry Ave Ste 470';

declare @delimiters table (d varchar(100));
insert into @delimiters
    select 'Suite' union all
    select 'Ste' union all
    select 'Bldg' union all
    select 'Building';

select  s, 
        cast('<r>'+ replace(s, d, '</r><r>'+d) + '</r>' as xml),
        [Street1] = cast('<r>'+ replace(s, d, '</r><r>'+d) + '</r>' as xml).value('r[1]', 'varchar(100)'),
        [Street2] = cast('<r>'+ replace(s, d, '</r><r>'+d) + '</r>' as xml).value('r[2]', 'varchar(100)')
from    @tab t
cross
apply   @delimiters d 
where   charindex(' '+d+' ', s) > 0;
于 2012-07-25T20:55:44.380 回答
1
select Addr,CASE WHEN CHARINDEX('suite',addr,1)>0 then LEFT(addr,CHARINDEX('suite',addr,1)-1)
            WHEN CHARINDEX('Ste',addr,1)>0 then LEFT(addr,CHARINDEX('Ste',addr,1)-1) 
            WHEN CHARINDEX('Bldg',addr,1)>0 then LEFT(addr,CHARINDEX('Bldg',addr,1)-1)
            WHEN CHARINDEX('Building',addr,1)>0 then LEFT(addr,CHARINDEX('Building',addr,1)-1)
            END as [Address],

            CASE WHEN CHARINDEX('suite',addr,1)>0 then RIGHT(addr,len(addr)-(CHARINDEX('suite',addr,1)-1))
            WHEN CHARINDEX('Ste',addr,1)>0 then RIGHT(addr,len(addr)-(CHARINDEX('Ste',addr,1)-1))
            WHEN CHARINDEX('Bldg',addr,1)>0 then RIGHT(addr,len(addr)-(CHARINDEX('Bldg',addr,1)-1))
            WHEN CHARINDEX('Building',addr,1)>0 then RIGHT(addr,len(addr)-(CHARINDEX('Building',addr,1)-1))
            END as [Address1]

 from Addr
于 2012-07-26T07:02:57.073 回答
-1

如果您要尝试解析这些数据,并且它不会被某些东西(即逗号)分隔,那么它将变得更加困难,您将不得不做出一些假设。拥有更大的数据集可以帮助您做出更有力的假设,但它仍然会非常脆弱。

查看您的数据,我认为您可以做出以下假设:1)地址2始终是最后2个单词(用空格分割时),因此您可以根据空格分割地址,并将最后2个用作地址2,其余为地址 1。 2) 您可以假设地址 1 是前 3 个字,其余为地址 2。

要拆分这些数据,我会使用与 split(' ', $data) 等效的 T-SQL 来获取单词数组。或者,使用与 strpos 和 strrpos 等效的 T-SQL 来查找倒数第二个空格,或第三个空格的位置,并将其前后的所有内容替换为适当的变量。

您可以根据可用数据做出决定,以选择更可靠的假设并使用它们。

于 2012-07-25T20:51:12.837 回答