Oracle
 sql >> Base de données >  >> RDS >> Oracle

Fonction SUBSTR() dans Oracle

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 ])

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: