sql >> Base de Datos >  >> RDS >> Oracle

Función SUBSTR() en Oracle

En Oracle, SUBSTR() la función devuelve una subcadena de una cadena dada.

SUBSTR() requiere al menos dos argumentos; la cadena y la posición desde la que extraer la subcadena. También acepta un tercer argumento opcional que le permite especificar la longitud que debe tener la subcadena.

SUBSTR() también se puede considerar como un grupo de funciones. Hay cinco funciones separadas; SUBSTR() , SUBSTRB() , SUBSTRC() , SUBSTR2() y SUBSTR4() . Cada función calcula la longitud de forma diferente.

Sintaxis

La sintaxis es así:

{ SUBSTR
| SUBSTRB
| SUBSTRC
| SUBSTR2
| SUBSTR4
}
(char, position [, substring_length ])

Donde char es la cadena, position es la posición inicial de la subcadena y substring_length es la longitud de los caracteres a extraer.

Las funciones calculan las longitudes de la siguiente manera:

Función Calcula la longitud usando…
SUBSTR() Caracteres definidos por el conjunto de caracteres de entrada
SUBSTRB() Bytes
SUBSTRC() Caracteres completos Unicode
SUBSTR2() Puntos de código UCS2
SUBSTR4() Puntos de código UCS4

Ejemplo

He aquí un ejemplo básico:

SELECT SUBSTR('Big fat cat', 5)
FROM DUAL;

Resultado:

fat cat

Comparado con SUBSTRB()

Este ejemplo muestra cómo los resultados pueden diferir, según la función específica que esté utilizando y el juego de caracteres involucrado.

En este caso, comparamos 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;

Resultado:

          SUBSTR           SUBSTRB 
________________ _________________ 
k yağlı pişik    ük yağlı pişik   

Podemos ver que las dos funciones arrojaron dos resultados diferentes. Esto se debe a que algunos caracteres de esta cadena utilizan dos bytes.

El SUBSTR() La función devuelve la longitud en ccaracteres según lo definido por el conjunto de caracteres de entrada, mientras que SUBSTRB() la función devuelve la longitud en bytes .

Si volvemos a la cadena original, los resultados son los mismos entre las dos funciones:

SELECT 
    SUBSTR('Big fat cat', 5) AS SUBSTR,
    SUBSTRB('Big fat cat', 5) AS SUBSTRB
FROM DUAL;

Resultado:

    SUBSTR    SUBSTRB 
__________ __________ 
fat cat    fat cat   

Esto se debe a que esta cadena usa solo un byte por carácter, por lo que la longitud en bytes es la misma que la cantidad de caracteres.

Longitud de subcadena

Aquí hay un ejemplo que especifica la longitud de la subcadena a extraer:

SELECT SUBSTR('Big fat cat', 5, 3)
FROM DUAL;

Resultado:

fat

Y aquí hay una comparación entre SUBSTR() y SUBSTRB() al especificar la longitud en caracteres de varios bytes:

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;

Resultado:

      SUBSTR    SUBSTRB 
____________ __________ 
k yağlı p    ük yağl    

Posición cero

Una peculiaridad de esta función es que, pasando una posición de 0 produce el mismo resultado que pasar 1 :

SELECT 
    SUBSTR('Big fat cat', 0, 3) AS "0",
    SUBSTR('Big fat cat', 1, 3) AS "1"
FROM DUAL;

Resultado:

     0      1 
______ ______ 
Big    Big   

Posición negativa

Especificar un valor negativo para la posición hace que la posición inicial se cuente hacia atrás desde el final de la cadena:

SELECT SUBSTR('Big fat cat', -3)
FROM DUAL;

Resultado:

cat

Y cualquier longitud que se especifique se cuenta desde esa posición hacia adelante:

SELECT SUBSTR('Big fat cat', -7, 3)
FROM DUAL;

Resultado:

fat

Argumentos nulos

Si alguno (o todos) de los argumentos son null , el resultado es 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;

Resultado:

     R1      R2      R3      R4 
_______ _______ _______ _______ 
null    null    null    null   

De forma predeterminada, SQLcl y SQL*Plus devuelven un espacio en blanco cada vez que null ocurre como resultado de un SQL SELECT declaración.

Sin embargo, puede usar SET NULL para especificar una cadena diferente a devolver. Aquí especifiqué que la cadena null debe ser devuelto.

Recuento de argumentos incorrecto

Llamando a SUBSTR() sin pasar ningún argumento da como resultado un error:

SELECT SUBSTR()
FROM DUAL;

Resultado:

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:

Y pasar demasiados argumentos también da como resultado un error:

SELECT SUBSTR('Big fat cat', 3, 2, 1)
FROM DUAL;

Resultado:

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: