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: