2017-09-05 104 views
0

我正在查找HSQLDB的查詢。SQL - 使用多次出現的「/」分割字符串

我有一個字符串,其中包含由「/」分隔的地址信息。現在我必須用「/」分隔這個字符串,並將單獨的地址信息插入單獨的列中。

Address = /1234/CLAREVIEW////WILMINGTON/DE/19702 

這需要拆分爲

StreetNo = Address[1] = 1234 
StreetName = Address[2] = CLAREVIEW 
StreetType = Address[3] = 
City = Address[6] = WILMINGTON 
StateCd = Address[7] = DE 
ZipCd = Address[8] = 19702 

我怎樣才能做到這一點?

+0

CREATE PROCEDURE與REGEXP_SUBSTRING_ARRAY功能分割成一個數組。然後INSERT INTO t(StreetNo,StreetName,StreetType ...)VALUES(arr [1],arr [2],arr [3],...) – fredt

+0

@fredt我從來沒有使用過REGEXP_SUBSTRING_ARRAY。我搜查,但無法找到有用的東西。你能給我提供一些例子嗎 – keanu

回答

1

CREATE PROCEDURE與REGEXP_SUBSTRING_ARRAY功能分割成一個數組。

REGEXP_SUBSTRING_ARRAY('/1234/CLAREVIEW////WILMINGTON/DE/19702', '/\p{Alnum}*'); 

返回

ARRAY['/1234','/CLAREVIEW','/','/','/','/WILMINGTON','/DE','/19702'] 

所以該過程應包含:

CREATE PROCEDURE INSERT_USING_REGEXP (p1 VARCHAR(500)) 
    BEGIN ATOMIC 
    DECLARE arr VARCHAR(200) ARRAY; 
    SET arr = REGEXP_SUBSTRING_ARRAY(p1,'/\p{Alnum}*'); 
    INSERT INTO thetable ((StreetNo, StreetName, StreetType...) VALUES (arr[1], arr[2], arr[3], ...); 
    END; 

然後

CALL INSERT_USING_REGEXP('/1234/CLAREVIEW////WILMINGTON/DE/19702'); 
+0

謝謝。太棒了。 – keanu

+0

Alnum dint似乎適合我。我用[a-zA-Z0-9]代替 – keanu

+0

有沒有辦法擴展正則表達式來包含特殊字符,而不僅僅是數字和字母 – keanu

-1
CREATE TABLE #Results 
    (
    Ordinal NUMERIC, 
    StringValue VARCHAR(MAX) 
    ) 

DECLARE @String VARCHAR(100), 
    @Delimiter VARCHAR(100) 

SET @String = '/1234/CLAREVIEW////WILMINGTON/DE/19702' 
SET @Delimiter = '/' 

DECLARE @TempString VARCHAR(MAX) = @String, 
    @Ordinal INT = 0, 
    @CharIndex INT = 0 

SET @CharIndex = CHARINDEX(@Delimiter, @TempString) 
WHILE @CharIndex != 0 
    BEGIN  
     SET @Ordinal += 1  
     INSERT #Results 
     VALUES (@Ordinal, SUBSTRING(@TempString, 0, @CharIndex))  
     SET @TempString = SUBSTRING(@TempString, @CharIndex + 1, LEN(@TempString) - @CharIndex)  
     SET @CharIndex = CHARINDEX(@Delimiter, @TempString) 
    END 

IF @TempString != '' 
    BEGIN 
     SET @Ordinal += 1 
     INSERT #Results 
     VALUES (@Ordinal, @TempString) 
    END 

SELECT * 
FROM  #Results 

I took this answer from here but it should do the trick

+0

爲什麼你認爲一個SQL Server解決方案(使用T-SQL)可以在HSQLDB上工作? –