V Oracle je to INSTR()
Funkce hledá podřetězec v daném řetězci a vrací celé číslo udávající pozici prvního znaku tohoto podřetězce. Pokud podřetězec není nalezen, funkce vrátí 0
.
INSTR()
vyžaduje alespoň dva argumenty; řetězec a podřetězec. Přijímá také volitelný třetí a čtvrtý argument, který vám umožňuje určit počáteční pozici pro vyhledávání a který výskyt hledat.
INSTR()
lze také chápat jako skupinu funkcí. Existuje pět samostatných funkcí; INSTR()
, INSTRB()
, INSTRC()
, INSTR2()
a INSTR4()
. Každá funkce počítá délku jiným způsobem.
Syntaxe
Syntaxe vypadá takto:
{ INSTR
| INSTRB
| INSTRC
| INSTR2
| INSTR4
}
(string , substring [, position [, occurrence ] ])
Kde string
je řetězec, který se má hledat, substring
je podřetězec, který se má najít, position
je počáteční pozice podřetězce a occurrence
je, který výskyt se má najít.
Funkce vypočítají délky následovně:
Funkce | Vypočítá délku pomocí… |
---|---|
INSTR() | Znaky definované vstupní znakovou sadou, přičemž první znak řetězce má pozici 1. |
INSTRB() | Bajtů |
INSTRC() | Úplné znaky Unicode |
INSTR2() | body kódu UCS2 |
INSTR4() | Kód UCS4 |
Příklad
Zde je základní příklad:
SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;
Výsledek:
5
Ve srovnání s INSTRB()
Tento příklad ukazuje, jak se mohou výsledky lišit v závislosti na konkrétní funkci, kterou používáte, a na použité znakové sadě.
V tomto případě porovnáme INSTR()
pomocí 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;
Výsledek:
INSTR INSTRB ________ _________ 7 9
Vidíme, že tyto dvě funkce vrátily dva různé výsledky. Důvodem je, že některé znaky v tomto řetězci používají dva bajty.
INSTR()
funkce vrací pozici definovanou vstupní znakovou sadou, zatímco INSTRB()
funkce vrací pozici založenou na bajtech .
Pokud se vrátíme k původnímu řetězci, výsledky jsou mezi oběma funkcemi stejné:
SELECT
INSTR('Big fat cat', 'fat') AS INSTR,
INSTRB('Big fat cat', 'fat') AS INSTRB
FROM DUAL;
Výsledek:
INSTR INSTRB ________ _________ 5 5
Je to proto, že tento řetězec používá pouze jeden bajt na znak, takže délka v bajtech je stejná jako počet znaků.
Výchozí pozice
Zde je příklad, který specifikuje pozici, pro kterou má začít vyhledávání:
SELECT INSTR('That fat cat', 'at', 8)
FROM DUAL;
Výsledek:
11
V tomto případě vyhledávání začíná na pozici 8, která je po prvních dvou výskytech. Tím získáváme pozici třetího zápasu.
Upřesněte, který výskyt
Zde je příklad určení, který výskyt se má najít:
SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;
Výsledek:
7
V tomto případě jsme začali na pozici 1 a poté jsme hledali druhý výskyt z této výchozí pozice.
Tady je to znovu, ale tentokrát porovnáme tři různé hodnoty 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;
Výsledek:
o1 o2 o3 _____ _____ _____ 3 7 11
Ale co se stane, když zvýšíme 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;
Výsledek:
o1 o2 o3 _____ _____ _____ 7 11 0
V tomto případě nezískáme pozici prvního výskytu, protože se nachází před naší výchozí pozicí. Dostaneme také 0
ve třetím sloupci, protože neexistuje žádný třetí výskyt na základě naší výchozí pozice.
Záporná pozice
Zadání záporné hodnoty pro pozici způsobí, že počáteční pozice bude počítána zpětně od konce řetězce a Oracle bude hledat zpětně od této pozice:
SELECT INSTR('That fat cat', 'at', -3)
FROM DUAL;
Výsledek:
7
A jakýkoli zadaný výskyt se počítá zpětně od této pozice:
SELECT INSTR('That fat cat', 'at', -3, 2)
FROM DUAL;
Výsledek:
3
Nulové argumenty
Pokud jsou některé (nebo všechny) argumenty null
, výsledkem je 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;
Výsledek:
R1 R2 R3 R4 _______ _______ _______ _______ null null null null
Ve výchozím nastavení vrátí SQLcl a SQL*Plus prázdné místo vždy, když null
dochází v důsledku SQL SELECT
prohlášení.
Můžete však použít SET NULL
určit jiný řetězec, který má být vrácen. Zde jsem uvedl, že řetězec null
by měl být vrácen.
Nesprávný počet argumentů
Volání INSTR()
bez předání jakýchkoli argumentů dojde k chybě:
SELECT INSTR()
FROM DUAL;
Výsledek:
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:
A předání příliš mnoha argumentů také vede k chybě:
SELECT INSTR('Big fat cat', 'at', 1, 2, 3)
FROM DUAL;
Výsledek:
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: