2017-09-05 1 views
0

Ich bin auf der Suche nach einer Abfrage für HSQLDB.SQL - Split eine Zeichenfolge mit "/", die mehrfach vorkommt

Ich habe eine Zeichenfolge, die Adressinformationen enthält, die durch "/" begrenzt sind. Jetzt muss ich diese Zeichenfolge durch "/" teilen und einzelne Adressinformationen in separate Spalten einfügen.

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

Dies muss als

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

Wie kann ich das erreichen?

+0

CREATE PROCEDURE mit der REGEXP_SUBSTRING_ARRAY Funktion in ein Array aufteilen. Dann INSERT INTO t (Straßennummer, Straßenname, Straßentyp ...) WERTE (arr [1], arr [2], arr [3], ...) – fredt

+0

@fredt Ich habe REGEXP_SUBSTRING_ARRAY noch nie benutzt. Ich suchte, aber konnte nichts hilfreiches finden. Können Sie mir bitte einige Beispiele nennen? – keanu

Antwort

1

CREATE Prozedur mit der Funktion REGEXP_SUBSTRING_ARRAY in ein Array aufzuteilen.

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

Returns

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

So sollte das Verfahren enthalten:

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; 

Dann

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

Danke. Dies ist perfekt. – keanu

+0

Alnum dint scheinen für mich zu arbeiten. Ich habe stattdessen [a-zA-Z0-9] verwendet. – keanu

+0

Gibt es eine Möglichkeit, die Regex um Sonderzeichen, nicht nur Zahlen und Alphabete zu erweitern – 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

Warum denken Sie, dass eine SQL Server-Lösung (mit T-SQL) auf HSQLDB funktionieren würde? –

Verwandte Themen