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;