Dans Oracle, le SUBSTR()
La fonction renvoie une sous-chaîne à partir d'une chaîne donnée.
SUBSTR()
nécessite au moins deux arguments ; la chaîne et la position pour laquelle extraire la sous-chaîne. Il accepte également un troisième argument facultatif qui vous permet de spécifier la longueur de la sous-chaîne.
SUBSTR()
peut également être considéré comme un ensemble de fonctions. Il y a cinq fonctions distinctes ; SUBSTR()
, SUBSTRB()
, SUBSTRC()
, SUBSTR2()
, et SUBSTR4()
. Chaque fonction calcule la longueur d'une manière différente.
Syntaxe
La syntaxe ressemble à ceci :
{ SUBSTR
| SUBSTRB
| SUBSTRC
| SUBSTR2
| SUBSTR4
}
(char, position [, substring_length ])
Où char
est la chaîne, position
est la position de départ de la sous-chaîne, et substring_length
est la longueur des caractères à extraire.
Les fonctions calculent les longueurs comme suit :
Fonction | Calcule la longueur en utilisant… |
---|---|
SUBSTR() | Caractères tels que définis par le jeu de caractères d'entrée |
SUBSTRB() | Octets |
SUBSTRC() | Caractères complets Unicode |
SUBSTR2() | Points de code UCS2 |
SUBSTR4() | Points de code UCS4 |
Exemple
Voici un exemple de base :
SELECT SUBSTR('Big fat cat', 5)
FROM DUAL;
Résultat :
fat cat
Par rapport à SUBSTRB()
Cet exemple montre comment les résultats peuvent différer, selon la fonction spécifique que vous utilisez et le jeu de caractères impliqué.
Dans ce cas, nous comparons SUBSTR()
avec 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;
Résultat :
SUBSTR SUBSTRB ________________ _________________ k yağlı pişik ük yağlı pişik
Nous pouvons voir que les deux fonctions ont renvoyé deux résultats différents. Cela est dû au fait que certains caractères de cette chaîne utilisent deux octets.
Le SUBSTR()
renvoie la longueur en ccaractères telle que définie par le jeu de caractères d'entrée, tandis que le SUBSTRB()
la fonction renvoie la longueur en octets .
Si nous revenons à la chaîne d'origine, les résultats sont les mêmes entre les deux fonctions :
SELECT
SUBSTR('Big fat cat', 5) AS SUBSTR,
SUBSTRB('Big fat cat', 5) AS SUBSTRB
FROM DUAL;
Résultat :
SUBSTR SUBSTRB __________ __________ fat cat fat cat
C'est parce que cette chaîne utilise un seul octet par caractère, et donc la longueur en octets est la même que le nombre de caractères.
Longueur de la sous-chaîne
Voici un exemple qui spécifie la longueur de la sous-chaîne à extraire :
SELECT SUBSTR('Big fat cat', 5, 3)
FROM DUAL;
Résultat :
fat
Et voici une comparaison entre SUBSTR()
et SUBSTRB()
lors de la spécification de la longueur sur les caractères multi-octets :
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;
Résultat :
SUBSTR SUBSTRB ____________ __________ k yağlı p ük yağl
Position zéro
Une bizarrerie de cette fonction est que, en passant une position de 0
produit le même résultat qu'en passant 1
:
SELECT
SUBSTR('Big fat cat', 0, 3) AS "0",
SUBSTR('Big fat cat', 1, 3) AS "1"
FROM DUAL;
Résultat :
0 1 ______ ______ Big Big
Position négative
Si vous spécifiez une valeur négative pour la position, la position de départ est comptée à rebours à partir de la fin de la chaîne :
SELECT SUBSTR('Big fat cat', -3)
FROM DUAL;
Résultat :
cat
Et toute longueur spécifiée est comptée à partir de cette position :
SELECT SUBSTR('Big fat cat', -7, 3)
FROM DUAL;
Résultat :
fat
Arguments nuls
Si l'un (ou tous) des arguments est null
, le résultat est 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;
Résultat :
R1 R2 R3 R4 _______ _______ _______ _______ null null null null
Par défaut, SQLcl et SQL*Plus renvoient un espace vide chaque fois que null
se produit à la suite d'un SQL SELECT
déclaration.
Cependant, vous pouvez utiliser SET NULL
pour spécifier une autre chaîne à renvoyer. Ici, j'ai précisé que la chaîne null
doit être retourné.
Nombre d'arguments incorrects
Appel de SUBSTR()
sans passer d'arguments entraîne une erreur :
SELECT SUBSTR()
FROM DUAL;
Résultat :
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:
Et passer trop d'arguments entraîne également une erreur :
SELECT SUBSTR('Big fat cat', 3, 2, 1)
FROM DUAL;
Résultat :
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: