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

INSTR() Funkcja w Oracle

W Oracle INSTR() funkcja wyszukuje podłańcuch w podanym łańcuchu i zwraca liczbę całkowitą wskazującą pozycję pierwszego znaku tego podłańcucha. Jeśli podciąg nie zostanie znaleziony, funkcja zwraca 0 .

INSTR() wymaga co najmniej dwóch argumentów; ciąg i podciąg. Akceptuje również opcjonalny trzeci i czwarty argument, który pozwala określić pozycję początkową wyszukiwania oraz wystąpienie wyszukiwania.

INSTR() można również traktować jako grupę funkcji. Istnieje pięć oddzielnych funkcji; INSTR() , INSTRB() , INSTRC() , INSTR2() i INSTR4() . Każda funkcja oblicza długość w inny sposób.

Składnia

Składnia wygląda tak:

{ INSTR
| INSTRB
| INSTRC
| INSTR2
| INSTR4
}
(string , substring [, position [, occurrence ] ])

Gdzie string jest ciągiem do przeszukania, substring jest podciągiem do znalezienia, position jest pozycją początkową podciągu, a occurrence to zdarzenie, które należy znaleźć.

Funkcje obliczają długości w następujący sposób:

Funkcja Oblicza długość za pomocą…
INSTR() Znaki zdefiniowane przez zestaw znaków wejściowych, przy czym pierwszy znak ciągu ma pozycję 1.
INSTRB() Bajtów
INSTRC() Kompletne znaki Unicode
INSTR2() Punkty kodowe UCS2
INSTR4() Punkty kodowe UCS4

Przykład

Oto podstawowy przykład:

SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;

Wynik:

5

W porównaniu z INSTRB()

Ten przykład pokazuje, w jaki sposób wyniki mogą się różnić w zależności od używanej konkretnej funkcji i zestawu znaków.

W tym przypadku porównujemy INSTR() z INSTRB() :

SELECT 
    INSTR('Böyük yağlı pişik', 'yağlı') AS INSTR,
    INSTRB('Böyük yağlı pişik', 'yağlı') AS INSTRB
FROM DUAL;

Wynik:

   INSTR    INSTRB 
________ _________ 
       7         9

Widzimy, że te dwie funkcje zwróciły dwa różne wyniki. Dzieje się tak, ponieważ niektóre znaki w tym ciągu używają dwóch bajtów.

INSTR() funkcja zwraca pozycję określoną przez zestaw znaków wejściowych, podczas gdy INSTRB() funkcja zwraca pozycję w bajtach .

Jeśli wrócimy do oryginalnego ciągu, wyniki obu funkcji są takie same:

SELECT 
    INSTR('Big fat cat', 'fat') AS INSTR,
    INSTRB('Big fat cat', 'fat') AS INSTRB
FROM DUAL;

Wynik:

   INSTR    INSTRB 
________ _________ 
       5         5 

Dzieje się tak, ponieważ ten ciąg używa tylko jednego bajtu na znak, więc długość w bajtach jest taka sama jak liczba znaków.

Pozycja wyjściowa

Oto przykład określający pozycję, od której należy rozpocząć wyszukiwanie:

SELECT INSTR('That fat cat', 'at', 8)
FROM DUAL;

Wynik:

11

W tym przypadku wyszukiwanie rozpoczyna się od pozycji 8, czyli po dwóch pierwszych wystąpieniach. Dlatego otrzymujemy pozycję trzeciego meczu.

Określ, które zdarzenie

Oto przykład określania, które wystąpienie należy znaleźć:

SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;

Wynik:

7

W tym przypadku zaczęliśmy od pozycji 1, a następnie szukaliśmy drugiego wystąpienia z tej pozycji początkowej.

I znowu, ale tym razem porównujemy trzy różne wartości dla occurrence argument:

SELECT 
    INSTR('That fat cat', 'at', 1, 1) AS "o1",
    INSTR('That fat cat', 'at', 1, 2) AS "o2",
    INSTR('That fat cat', 'at', 1, 3) AS "o3"
FROM DUAL;

Wynik:

   o1    o2    o3 
_____ _____ _____ 
    3     7    11

Ale oto, co się stanie, jeśli zwiększymy position argument:

SELECT 
    INSTR('That fat cat', 'at', 5, 1) AS "o1",
    INSTR('That fat cat', 'at', 5, 2) AS "o2",
    INSTR('That fat cat', 'at', 5, 3) AS "o3"
FROM DUAL;

Wynik:

   o1    o2    o3 
_____ _____ _____ 
    7    11     0 

W tym przypadku nie otrzymujemy pozycji pierwszego wystąpienia, ponieważ znajduje się ona przed naszą pozycją wyjściową. Otrzymujemy również 0 w trzeciej kolumnie, ponieważ nie ma trzeciego wystąpienia, w oparciu o naszą pozycję wyjściową.

Pozycja ujemna

Określenie ujemnej wartości pozycji powoduje, że pozycja początkowa jest liczona wstecz od końca ciągu, a Oracle przeszukuje wstecz od tej pozycji:

SELECT INSTR('That fat cat', 'at', -3)
FROM DUAL;

Wynik:

7

Każde określone wystąpienie jest liczone wstecz od tej pozycji:

SELECT INSTR('That fat cat', 'at', -3, 2)
FROM DUAL;

Wynik:

3

Argumenty zerowe

Jeśli którykolwiek (lub wszystkie) argumenty są null , wynik to null :

SET NULL 'null';
SELECT 
    INSTR(null, 'f', 1, 1) AS r1,
    INSTR('Coffee', null, 1, 1) AS r2,
    INSTR('Coffee', 'f', null, 1) AS r3,
    INSTR('Coffee', 'f', 1, null) AS r4
FROM DUAL;

Wynik:

     R1      R2      R3      R4 
_______ _______ _______ _______ 
   null    null    null    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ć.

Nieprawidłowa liczba argumentów

Wywołanie INSTR() bez przekazywania jakichkolwiek argumentów powoduje błąd:

SELECT INSTR()
FROM DUAL;

Wynik:

Error starting at line : 1 in command -
SELECT 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:

Przekazywanie zbyt wielu argumentów również skutkuje błędem:

SELECT INSTR('Big fat cat', 'at', 1, 2, 3)
FROM DUAL;

Wynik:

Error starting at line : 1 in command -
SELECT INSTR('Big fat cat', 'at', 1, 2, 3)
FROM DUAL
Error at Command Line : 1 Column : 38
Error report -
SQL Error: ORA-00939: too many arguments for function
00939. 00000 -  "too many arguments for function"
*Cause:    
*Action:

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Procedury składowane programu SQL Server firmy Oracle®

  2. Sparametryzowane zapytanie w problemach z Oracle

  3. UTRZYMANIE LOB

  4. Porównanie z datą w Oracle sql

  5. Funkcja LENGTH() w Oracle