Oracle
 sql >> Baza danych >  >> RDS >> Oracle

REGEXP_INSTR() Funkcja w Oracle

W Oracle REGEXP_INSTR() funkcja przeszukuje ciąg w poszukiwaniu wzorca wyrażenia regularnego. Zwraca liczbę całkowitą wskazującą początkową lub końcową pozycję dopasowanego podciągu (niezależnie od tego, który określisz).

Rozszerza funkcjonalność INSTR() funkcji, pozwalając nam na użycie wzorców wyrażeń regularnych.

Składnia

Składnia wygląda tak:

REGEXP_INSTR ( source_char, pattern
               [, position
                  [, occurrence
                     [, return_opt
                        [, match_param
                           [, subexpr ]
                        ]
                     ]
                  ]
               ]
             )

Gdzie:

  • source_char to wyrażenie znakowe, które służy jako wartość wyszukiwania.
  • pattern jest wyrażeniem regularnym.
  • position jest dodatnią liczbą całkowitą, która określa, gdzie rozpocząć wyszukiwanie. Wartość domyślna to 1 , czyli rozpocznij wyszukiwanie od pierwszego znaku.
  • occurrence jest dodatnią liczbą całkowitą, która określa, które wystąpienie ma zostać wyszukane. Wartość domyślna to 1 , co oznacza wyszukiwanie pierwszego wystąpienia.
  • return_opt określa, czy Oracle ma zwrócić pozycję początkową, czy końcową dopasowanego podciągu. Użyj 0 na początek i 1 na zakończenie. Domyślna wartość to 0 .
  • match_param pozwala zmienić domyślne zachowanie dopasowania funkcji. Na przykład pozwala określić wielkość liter, sposób obsługi wielu linii i spacji itp. Ten argument działa tak samo, jak w przypadku użycia z REGEXP_COUNT() funkcjonować. Zobacz dokumentację Oracle dotyczącą tej funkcji, aby uzyskać więcej informacji.
  • Dla pattern z wyrażeniami podrzędnymi, subexpr jest nieujemną liczbą całkowitą od 0 do 9 wskazującą, które podwyrażenie we pattern ma być zwrócona przez funkcję. Ten argument działa tak samo, jak używany z REGEXP_INSTR() funkcjonować. Więcej informacji na temat tej funkcji można znaleźć w dokumentacji Oracle.

Przykład

Oto podstawowy przykład użycia REGEXP_INSTR() w Oracle:

SELECT 
    REGEXP_INSTR('My dogs are fluffy', 'd.g')
FROM DUAL;

Wynik:

4

W tym przypadku występuje dopasowanie i zwracana jest pozycja początkowa podciągu.

Wyrażenia regularne mogą mieć bardzo duże możliwości, a w tym przykładzie użyto bardzo prostego przykładu. Aby użyć REGEXP_INSTR() skutecznie, będziesz musiał znać właściwy wzór, aby uzyskać pożądany efekt.

Brak dopasowania

Oto przykład, w którym nie ma dopasowania:

SELECT REGEXP_INSTR('My dogs like dregs', 't.g')
FROM DUAL;

Wynik:

0

Brak dopasowania, więc 0 jest zwracany.

Wiele meczów

Oto przykład z wieloma dopasowaniami:

SELECT 
    REGEXP_INSTR('My dogs have dags', 'd.g')
FROM DUAL;

Wynik:

4

Zwrócił pozycję pierwszego wystąpienia.

Możesz jednak określić, które wystąpienie ma zostać zastąpione:

SELECT 
REGEXP_INSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;

Wynik:

14

Zauważ, że dodałem tutaj dwa argumenty; 1 i 2 . 1 określa miejsce pobytu w ciągu, aby rozpocząć wyszukiwanie (w tym przypadku od pierwszego znaku). 2 określa, które wystąpienie ma zostać wyszukane. W takim przypadku wyszukiwane jest drugie wystąpienie.

Oto, co się stanie, jeśli rozpocznę wyszukiwanie po pierwszym wystąpieniu:

SELECT 
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;

Wynik:

0

W tym przypadku nie ma dopasowania, ponieważ po pozycji wyjściowej występuje tylko jeden przypadek.

Jeśli zmienię ostatni argument na 1 , otrzymujemy dopasowanie (ponieważ jest to pierwsze wystąpienie po określonej pozycji startowej):

SELECT 
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;

Wynik:

14

Zwróć pozycję końcową

Możesz przekazać piąty argument z 0 lub 1 aby określić, czy funkcja powinna zwracać pozycję początkową czy końcową podciągu.

Domyślna wartość to 0 (dla pozycji początkowej). Oto, co się stanie, jeśli określimy 1 :

SELECT 
    REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1)
FROM DUAL;

Wynik:

7

Żeby było jasne, oto znowu w porównaniu z 0 :

SELECT 
    REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 0) AS "Start",
    REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1) AS "End"
FROM DUAL;

Wynik:

   Start    End 
________ ______ 
       4      7

Wrażliwość na wielkość liter

REGEXP_INSTR() Funkcja jest zgodna z regułami określania i wyprowadzania Oracle, które definiują sortowanie, które ma być używane podczas dopasowywania ciągu do wzorca.

Można jednak jawnie określić rozróżnianie wielkości liter z opcjonalnym szóstym argumentem. Gdy to zrobisz, zastępuje to rozróżnianie wielkości liter lub akcentu w określonym zestawieniu.

Możesz określić i dla dopasowania bez rozróżniania wielkości liter i c do dopasowywania z uwzględnieniem wielkości liter.

Oto przykład:

SELECT 
    REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0) AS "Default",
    REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0, 'i') AS "Case Insensitive",
    REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0, 'c') AS "Case Sensitive"
FROM DUAL;

Wynik:

   Default    Case Insensitive    Case Sensitive 
__________ ___________________ _________________ 
         0                   4                 0

Na podstawie tych wyników moje zestawienie wydaje się uwzględniać wielkość liter. Pozostałe dwa ciągi zostały zmuszone do dopasowania odpowiednio bez rozróżniania i rozróżniania wielkości liter.

Wyrażenia podrzędne

Oto przykład użycia szóstego argumentu do zwrócenia określonego wzorca podwyrażenia:

SELECT REGEXP_INSTR(
    'catdogcow', 
    '(c.t)(d.g)(c.w)', 
    1, 1, 0, 'i', 1
    )
FROM DUAL;

Wynik:

1

W tym przypadku zwróciłem pierwsze podwyrażenie.

Oto, co się stanie, jeśli określę trzecie podwyrażenie:

SELECT REGEXP_INSTR(
    'catdogcow', 
    '(c.t)(d.g)(c.w)', 
    1, 1, 0, 'i', 3
    )
FROM DUAL;

Wynik:

7

Argumenty zerowe

Z wyjątkiem szóstego argumentu, podając null dla argumentu daje wynik null :

SET NULL 'null';
SELECT 
    REGEXP_INSTR(null, 'c.t', 1, 1, 0, 'i', 1) AS "1",
    REGEXP_INSTR('Cat', null, 1, 1, 0, 'i', 1) AS "2",
    REGEXP_INSTR('Cat', 'c.t', null, 1, 0, 'i', 1) AS "3",
    REGEXP_INSTR('Cat', 'c.t', 1, null, 0, 'i', 1) AS "4",
    REGEXP_INSTR('Cat', 'c.t', 1, 1, null, 'i', 1) AS "5",
    REGEXP_INSTR('Cat', 'c.t', 1, 1, 0, null, 1) AS "6",
    REGEXP_INSTR('Cat', 'c.t', 1, 1, 0, 'i', null) AS "7"
FROM DUAL;

Wynik:

      1       2       3       4       5    6       7 
_______ _______ _______ _______ _______ ____ _______ 
   null    null    null    null    null    0    null 

Domyślnie SQLcl i SQL*Plus zwracają spację, gdy null występuje w wyniku polecenia SQL SELECT oświadczenie.

Możesz jednak użyć SET NULL aby określić inny ciąg do zwrócenia. Tutaj określiłem, że ciąg null należy zwrócić.

Niewłaściwa liczba argumentów

Przekazanie funkcji bez argumentów lub za mało, skutkuje błędem:

SELECT REGEXP_INSTR()
FROM DUAL;

Wynik:

Error starting at line : 1 in command -
SELECT REGEXP_INSTR()
FROM DUAL
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00938: not enough arguments for function
00938. 00000 -  "not enough arguments for function"
*Cause:    
*Action:

To samo dotyczy sytuacji, gdy przekazujemy zbyt wiele argumentów:

SELECT REGEXP_INSTR('Cat', 'c.t', 1, 1, 1, 'i', 1, 'oops')
FROM DUAL;

Wynik:

Error starting at line : 1 in command -
SELECT REGEXP_INSTR('Cat', 'c.t', 1, 1, 1, 'i', 1, 'oops')
FROM DUAL
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00939: too many arguments for function
00939. 00000 -  "too many arguments for function"
*Cause:    
*Action:

Więcej informacji

REGEXP_INSTR() funkcja (jak również inna implementacja wyrażeń regularnych Oracle) jest zgodna ze standardem wyrażeń regularnych IEEE Portable Operating System Interface (POSIX) oraz z wytycznymi Unicode dotyczącymi wyrażeń regularnych Unicode Consortium.

Zobacz dokumentację Oracle, aby uzyskać więcej informacji i przykładów REGEXP_INSTR() funkcja.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmienić priorytet dla programu równoległego?

  2. Jak wyjść ze skryptu w SQLPlus, gdy wystąpi błąd i powrócić do monitu SQLPlus, bez rozłączania się lub zamykania SQLPlus?

  3. Jak obsłużyć wyjątki to_date w instrukcji SELECT, aby zignorować te wiersze?

  4. Wypełnianie wartości wyświetlanego elementu w zapytaniu w formularzach Oracle

  5. Czy możemy mieć wiele WITH AS w jednym sql - Oracle SQL?