Problem:
Chcesz podzielić ciąg w Oracle.
Przykład:
Masz zdanie i chcesz je podzielić przez spację.
Rozwiązanie:
SELECT REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) AS parts FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL;
Tabela wyników wygląda tak:
części |
---|
An |
przykład |
zdanie. |
Dyskusja:
Aby uzyskać podciągi z ciągu, możesz użyć wbudowanej funkcji Oracle REGEXP_SUBSTR(). Wymaga czterech argumentów:
- Ciąg do wyszukania podciągu.
- Wyrażenie regularne; czyli wzór, który chcesz znaleźć.
- Pozycja, od której chcesz zacząć szukać wzorca (wartość domyślna to 1, co oznacza rozpoczęcie od początku ciągu).
- Liczba określająca wystąpienie pasującego podciągu, które chcesz zobaczyć (wartość domyślna to
1
, co oznacza, że powinien zostać wyświetlony pierwszy pasujący podciąg).
W naszym przykładzie ciąg do przeszukania to „An example sentence.
' W ciągu szukasz podciągów, które są słowami, które definiujemy tutaj jako dowolne grupy dowolnych znaków z wyjątkiem spacji. Dlatego podajemy wzorzec '[^ ]+
', tj. dowolna sekwencja znaków niebędących spacją. [^ ]
oznacza dowolny znak z wyjątkiem spacji, a +
znak oznacza jedno lub więcej wystąpień takich znaków. Trzeci argument powinien być domyślnym (1
), ponieważ chcesz szukać słów w całym ciągu od początku. Ostatni argument jest najtrudniejszy – musisz zmienić jego wartość dla każdego przeszukiwanego ciągu. Powinien być level – pseudokolumna dostępna w zapytaniach hierarchicznych przy użyciu CONNECT BY
– który w naszym przypadku będzie równy numerowi wiersza bieżącego wiersza w wyniku przy użyciu CONNECT BY. Masz więc:
REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level)
To wyrażenie powinno być wybrane z dual
– pseudotabela używana w Oracle, gdy nie wybierasz z rzeczywistej tabeli. Następnie powinieneś CONNECT BY
hierarchiczny operator zapytań, pod warunkiem, że pobrany podciąg nie powinien mieć wartości NULL
. Pobrany podciąg będzie miał wartość NULL po pobraniu wszystkich słów; zapytanie hierarchiczne zatrzyma wykonanie. Masz więc:
FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL
Możesz przeczytać tutaj o poziomie i CONNECT BY.
Jeśli chcesz podzielić ciąg za pomocą innego ogranicznika, możesz łatwo zmodyfikować zapytanie. Na przykład, jeśli chcesz podzielić ciąg przez przecinek, zmień „[^ ]
+' do '[^,]+
„. Oto przykładowe zapytanie:
SELECT REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) AS parts FROM dual CONNECT BY REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) IS NOT NULL;