In Oracle, il SUBSTR()
la funzione restituisce una sottostringa da una determinata stringa.
SUBSTR()
richiede almeno due argomenti; la stringa e la posizione da cui estrarre la sottostringa. Accetta anche un terzo argomento opzionale che consente di specificare la lunghezza della sottostringa.
SUBSTR()
può anche essere pensato come un insieme di funzioni. Ci sono cinque funzioni separate; SUBSTR()
, SUBSTRB()
, SUBSTRC()
, SUBSTR2()
e SUBSTR4()
. Ogni funzione calcola la lunghezza in modo diverso.
Sintassi
La sintassi è questa:
{ SUBSTR
| SUBSTRB
| SUBSTRC
| SUBSTR2
| SUBSTR4
}
(char, position [, substring_length ])
Dove char
è la stringa, position
è la posizione iniziale della sottostringa e substring_length
è la lunghezza dei caratteri da estrarre.
Le funzioni calcolano le lunghezze come segue:
Funzione | Calcola la lunghezza usando... |
---|---|
SUBSTR() | Caratteri definiti dal set di caratteri di input |
SUBSTRB() | Byte |
SUBSTRC() | Caratteri completi Unicode |
SUBSTR2() | Punti di codice UCS2 |
SUBSTR4() | Punti di codice UCS4 |
Esempio
Ecco un esempio di base:
SELECT SUBSTR('Big fat cat', 5)
FROM DUAL;
Risultato:
fat cat
Rispetto a SUBSTRB()
Questo esempio mostra come i risultati possono differire, a seconda della funzione specifica che stai utilizzando e del set di caratteri coinvolto.
In questo caso, confrontiamo SUBSTR()
con 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;
Risultato:
SUBSTR SUBSTRB ________________ _________________ k yağlı pişik ük yağlı pişik
Possiamo vedere che le due funzioni hanno restituito due risultati diversi. Questo perché alcuni caratteri in questa stringa utilizzano due byte.
Il SUBSTR()
la funzione restituisce la lunghezza in ccaratteri come definito dal set di caratteri di input, mentre SUBSTRB()
la funzione restituisce la lunghezza in byte .
Se torniamo alla stringa originale, i risultati sono gli stessi tra le due funzioni:
SELECT
SUBSTR('Big fat cat', 5) AS SUBSTR,
SUBSTRB('Big fat cat', 5) AS SUBSTRB
FROM DUAL;
Risultato:
SUBSTR SUBSTRB __________ __________ fat cat fat cat
Questo perché questa stringa utilizza solo un byte per carattere, quindi la lunghezza in byte è uguale al numero di caratteri.
Lunghezza sottostringa
Ecco un esempio che specifica la lunghezza della sottostringa da estrarre:
SELECT SUBSTR('Big fat cat', 5, 3)
FROM DUAL;
Risultato:
fat
Ed ecco un confronto tra SUBSTR()
e SUBSTRB()
quando si specifica la lunghezza su caratteri multibyte:
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;
Risultato:
SUBSTR SUBSTRB ____________ __________ k yağlı p ük yağl
Posizione zero
Una stranezza di questa funzione è che, passando una posizione di 0
produce lo stesso risultato del passaggio di 1
:
SELECT
SUBSTR('Big fat cat', 0, 3) AS "0",
SUBSTR('Big fat cat', 1, 3) AS "1"
FROM DUAL;
Risultato:
0 1 ______ ______ Big Big
Posizione negativa
Specificando un valore negativo per la posizione, la posizione iniziale viene contata all'indietro dalla fine della stringa:
SELECT SUBSTR('Big fat cat', -3)
FROM DUAL;
Risultato:
cat
E qualsiasi lunghezza specificata viene contata da quella posizione in avanti:
SELECT SUBSTR('Big fat cat', -7, 3)
FROM DUAL;
Risultato:
fat
Argomenti nulli
Se uno (o tutti) gli argomenti sono null
, il risultato è 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;
Risultato:
R1 R2 R3 R4 _______ _______ _______ _______ null null null null
Per impostazione predefinita, SQLcl e SQL*Plus restituiscono uno spazio vuoto ogni volta che null
si verifica come risultato di un SQL SELECT
dichiarazione.
Tuttavia, puoi utilizzare SET NULL
per specificare una stringa diversa da restituire. Qui ho specificato che la stringa null
deve essere restituito.
Conteggio argomenti errato
Chiamando SUBSTR()
senza passare alcun argomento genera un errore:
SELECT SUBSTR()
FROM DUAL;
Risultato:
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:
E anche il passaggio di troppi argomenti provoca un errore:
SELECT SUBSTR('Big fat cat', 3, 2, 1)
FROM DUAL;
Risultato:
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: