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

これらのアドレスを次のように分割したいaddress1address2思います。

+---------------------+--------------+
|      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
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

分割を実行する区切り文字のテーブルを使用できます。この例では、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

このデータを解析しようとしていて、それが何か (コンマなど) で区切られていない場合、それは非常に難しくなり、いくつかの仮定を立てる必要があります。より大きなデータ セットを使用すると、より強力な仮定を立てることができますが、それでも非常に脆弱です。

データを見て、次の仮定を立てることができると思います: 1) アドレス 2 は常に最後の 2 語 (スペースで分割された場合) であるため、アドレスをスペースに基づいて分割し、最後の 2 語をアドレス 2 として使用できます。 2) アドレス 1 が最初の 3 ワードで、残りがアドレス 2 であると想定できます。

このデータを分割するには、split(' ', $data) に相当する T-SQL を使用して単語の配列を取得します。または、strpos と strrpos に相当する T-SQL を使用して、2 番目から最後のスペース、または 3 番目のスペースの位置を見つけ、その前後のすべてを適切な変数に部分文字列化します。

利用可能なデータに基づいて決定を下し、より堅牢な仮定を選択してそれらを使用するのはあなた次第です。

于 2012-07-25T20:51:12.837 に答える