从具有多个分隔符和位置的字符串中提取街道地址

uns*_*138 5 sql-server-2005 sql-server string-manipulation

试图从这些数据中提取街道地址:

CREATE TABLE foo(Places varchar(50));
INSERT foo(Places) VALUES
('MARKET @123 NORTH RD'),
('HARDWARE @600 Main RD ;W1'),
('MAIN AV / NORTH RD'),
('500 NORTH RD @LIBRARY'),
('500 ANYSTREET ; *** SIDEWALK****'),
('MARKET @123 NORTH RD'),
('700 ANYSTREET'),
('(088.12345,088.12345) ;75 SOUTH RD');
Run Code Online (Sandbox Code Playgroud)

我一直在尝试使用 CASE、SUBSTRING 和 (CHAR/PAT)INDEX ......但我只是没有正确地做到这一点。

Select 
[Address] = CASE WHEN PATINDEX('%@[0-9]%' , Places) = 0 THEN     (SUBSTRING(Places, 0, CHARINDEX('@',Places)))
                WHEN PATINDEX('%@[a-z]%' , Places) = 0 THEN     (SUBSTRING(Places, CHARINDEX('@',Places) + 1, LEN(Places)))
                WHEN PATINDEX('%;[0-9]%' , Places) = 0 THEN (SUBSTRING(Places, CHARINDEX(';',Places) + 1, LEN(Places)))
                WHEN PATINDEX('[0-9]%' , Places) = 1 THEN (SUBSTRING(Places, 0, CHARINDEX(';',Places))) 
                WHEN PATINDEX('%/%' , Places) > 0 THEN Places END

From dbo.foo
Run Code Online (Sandbox Code Playgroud)

获取这些数据的更好方法是什么?我已经查看了用于查找电子邮件地址的字符串选择,但在处理 ';' 时似乎再次失败

蒂亚!

编辑所需的输出,表格包含:

123 NORTH RD 
600 Main RD
MAIN AV / NORTH RD
500 NORTH RD 
500 ANYSTREET
123 NORTH RD 
700 ANYSTREET
7575 SOUTH RD
Run Code Online (Sandbox Code Playgroud)

pau*_*bin 4

尝试这个。

;With cte as
(
Select 
    places,
    StartHere = 
        CASE 
            WHEN PATINDEX('%@[0-9]%', places) > 0 THEN PATINDEX('%@[0-9]%', places) + 1     -- @ plus number, start here
            WHEN PATINDEX('%;[0-9]%', places) > 0 THEN PATINDEX('%;[0-9]%', places) + 1     -- ; plus number, start here
            ELSE 0
        END
    ,EndHere = 
        CASE
            WHEN PATINDEX('%@[a-z]%', places) > 0 THEN PATINDEX('%@[a-z]%', places)   -- @plus letter, stop here        
            WHEN PATINDEX('%@[0-9]%', places) > 0 AND PATINDEX('%;%', places) > 0 THEN  PATINDEX('%;%', places)  --@ plus number stop on semicolon if there
            WHEN PATINDEX('%;[0-9]%', places) = 0 AND PATINDEX('%;%', places) > 0 THEN PATINDEX('%;%', places)   --no semi plus number, so stop on semicolon if there
            ELSE len(places) + 1
        END
FROM
    foo
)
    SELECT 
        places, 
        StartHere
        ,EndHere
        ,SUBSTRING(places, StartHere, EndHere - StartHere)
    FROM 
        cte
Run Code Online (Sandbox Code Playgroud)