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

Funkce SUBSTR() v Oracle

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:

  1. Nedostatečná oprávnění PL/SQL v rámci dotazu jsou možná ručně

  2. MySQL seskupit podle a seřadit podle

  3. Vrátí počet řádků ovlivněných příkazy UPDATE

  4. MariaDB CONNECTION_ID() Vysvětleno