sql >> Databáze >  >> RDS >> Oracle

Funkce INSTR() v Oracle

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:

  1. Oracle ODP.Net With Entity Framework 6 – poskytovatel kompatibilní s databází Entity Framework nebyl nalezen

  2. dbms_metadata.get_ddl nefunguje

  3. Používání ODBC se Salesforce a OneLogin Single Sign On (SSO)

  4. Jak naplánovat uloženou proceduru v MySQL