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: