V Oracle, SUBSTR()
funkce vrací podřetězec z daného řetězce.
SUBSTR()
vyžaduje alespoň dva argumenty; řetězec a pozici, ze které se má podřetězec extrahovat. Přijímá také volitelný třetí argument, který vám umožňuje určit, jak dlouhý má být podřetězec.
SUBSTR()
lze také chápat jako skupinu funkcí. Existuje pět samostatných funkcí; SUBSTR()
, SUBSTRB()
, SUBSTRC()
, SUBSTR2()
a SUBSTR4()
. Každá funkce počítá délku jiným způsobem.
Syntaxe
Syntaxe vypadá takto:
{ SUBSTR
| SUBSTRB
| SUBSTRC
| SUBSTR2
| SUBSTR4
}
(char, position [, substring_length ])
Kde char
je řetězec, position
je počáteční pozice podřetězce a substring_length
je délka znaků k extrakci.
Funkce vypočítají délky následovně:
Funkce | Vypočítá délku pomocí… |
---|---|
SUBSTR() | Znaky definované vstupní znakovou sadou |
SUBSTRB() | Bajtů |
SUBSTRC() | Úplné znaky Unicode |
SUBSTR2() | body kódu UCS2 |
SUBSTR4() | Kód UCS4 |
Příklad
Zde je základní příklad:
SELECT SUBSTR('Big fat cat', 5)
FROM DUAL;
Výsledek:
fat cat
Ve srovnání s SUBSTRB()
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 SUBSTR()
pomocí SUBSTRB()
:
SELECT
SUBSTR('Böyük yağlı pişik', 5) AS SUBSTR,
SUBSTRB('Böyük yağlı pişik', 5) AS SUBSTRB
FROM DUAL;
Výsledek:
SUBSTR SUBSTRB ________________ _________________ k yağlı pişik ük yağlı pişik
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.
SUBSTR()
funkce vrací délku v cznaků, jak je definována vstupní znakovou sadou, zatímco SUBSTRB()
funkce vrací délku v bajtech .
Pokud se vrátíme k původnímu řetězci, výsledky jsou mezi oběma funkcemi stejné:
SELECT
SUBSTR('Big fat cat', 5) AS SUBSTR,
SUBSTRB('Big fat cat', 5) AS SUBSTRB
FROM DUAL;
Výsledek:
SUBSTR SUBSTRB __________ __________ fat cat fat cat
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ů.
Délka podřetězce
Zde je příklad, který určuje délku podřetězce k extrahování:
SELECT SUBSTR('Big fat cat', 5, 3)
FROM DUAL;
Výsledek:
fat
A zde je srovnání mezi SUBSTR()
a SUBSTRB()
při zadávání délky u vícebajtových znaků:
SELECT
SUBSTR('Böyük yağlı pişik', 5, 9) AS SUBSTR,
SUBSTRB('Böyük yağlı pişik', 5, 9) AS SUBSTRB
FROM DUAL;
Výsledek:
SUBSTR SUBSTRB ____________ __________ k yağlı p ük yağl
Nula pozice
Jednou zvláštností této funkce je předání pozice 0
vede ke stejnému výsledku jako předání 1
:
SELECT
SUBSTR('Big fat cat', 0, 3) AS "0",
SUBSTR('Big fat cat', 1, 3) AS "1"
FROM DUAL;
Výsledek:
0 1 ______ ______ Big Big
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:
SELECT SUBSTR('Big fat cat', -3)
FROM DUAL;
Výsledek:
cat
A jakákoliv zadaná délka se počítá od této pozice dopředu:
SELECT SUBSTR('Big fat cat', -7, 3)
FROM DUAL;
Výsledek:
fat
Nulové argumenty
Pokud jsou některé (nebo všechny) argumenty null
, výsledkem je null
:
SET NULL 'null';
SELECT
SUBSTR(null, 3, 3) AS r1,
SUBSTR('Coffee', null, 3) AS r2,
SUBSTR('Coffee', 3, null) AS r3,
SUBSTR(null, null, 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í SUBSTR()
bez předání jakýchkoli argumentů dojde k chybě:
SELECT SUBSTR()
FROM DUAL;
Výsledek:
Error starting at line : 1 in command - SELECT SUBSTR() 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 SUBSTR('Big fat cat', 3, 2, 1)
FROM DUAL;
Výsledek:
Error starting at line : 1 in command - SELECT SUBSTR('Big fat cat', 3, 2, 1) FROM DUAL Error at Command Line : 1 Column : 36 Error report - SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function" *Cause: *Action: