Problema:
Cómo extraer una subcadena de una cadena en PostgreSQL/MySQL
Ejemplo 1:
En los emails
tabla, hay una columna de correo electrónico. Le gustaría mostrar los primeros siete caracteres de cada correo electrónico.
La tabla se ve así:
correo electrónico |
---|
[email protected] |
[email protected] |
[email protected] |
[email protected] |
Solución 1:
SELECT email, SUBSTRING(email, 1, 7) AS substring FROM emails;
Otra sintaxis:
SELECT email, SUBSTRING(email FROM 1 FOR 7) AS substring FROM emails;
El resultado es:
correo electrónico | subcadena |
---|---|
[email protected] | jake99@ |
[email protected] | tamarab |
[email protected] | nota@ |
[email protected] | Jessica |
Discusión:
Usa la SUBSTRING()
función. El primer argumento es la cadena o el nombre de la columna. El segundo argumento es el índice del carácter en el que debe comenzar la subcadena. El tercer argumento es la longitud de la subcadena.
¡Cuidado! A diferencia de otros lenguajes de programación, los índices comienzan en 1 , no 0. Esto significa que el primer carácter tiene índice 1, el segundo carácter tiene índice 2, etc.
SUBSTRING(email, 1, 7)
devolverá las subcadenas de los valores en la columna de correo electrónico que comienzan al principio de las cadenas (primer carácter) y van por siete caracteres. La otra notación, SUBSTRING(email FROM 1 FOR 7)
, hace exactamente lo mismo. El argumento después del FROM
es el índice inicial y el argumento después de FOR
es la longitud de la subcadena.
El tercer argumento de SUBSTRING()
La función es opcional. Si lo omite, obtendrá la subcadena que comienza en el índice del segundo argumento y llega hasta el final de la cadena. SUBSTRING(email, 1)
devolverá la cadena completa, al igual que SUBSTRING(email FROM 1)
.
Ejemplo 2:
Le gustaría mostrar la subcadena entre los índices 2 y 6 (inclusive).
Solución 2:
SELECT email, SUBSTRING(email, 2, 5) AS substring FROM emails;
Otra sintaxis:
SELECT email, SUBSTRING(email FROM POSITION('@' IN email)) AS substring FROM emails;
El resultado es:
correo electrónico | subcadena |
---|---|
[email protected] | @gmail.com |
[email protected] | @zoho.com |
[email protected] | @yahoo.fr |
[email protected] | @onet.pl |
Discusión:
Usas el SUBSTRING()
funciona como en los ejemplos anteriores. Esta vez, está buscando un personaje específico cuya posición puede variar de una fila a otra. Para encontrar el índice del carácter específico, puede utilizar POSITION(character IN column)
función, donde el carácter es el carácter específico en el que le gustaría comenzar la subcadena (aquí, @
) . La columna de argumento es la column
desde el que le gustaría recuperar la subcadena; también puede ser una cadena literal.
Si desea que la subcadena llegue hasta el final de la cadena original, el tercer argumento en SUBSTRING()
(o la función FOR
argumento) no es necesario. De lo contrario, debería ser la longitud de la subcadena, o puede calcularla usando POSITION()
función. También puede querer recuperar una subcadena que no termine al final de la cadena sino en algún carácter específico, por ejemplo, antes de '.'. He aquí un ejemplo:
SELECT email, SUBSTRING(email, POSITION('@' IN email), POSITION('.' IN email) - POSITION('@' IN email)) AS substring FROM emails;
Otra sintaxis:
SELECT email, SUBSTRING(email FROM POSITION('@' IN email) FOR POSITION('.' IN email) - POSITION('@' IN email)) AS substring FROM emails;
El resultado de esta consulta es:
correo electrónico | subcadena |
---|---|
[email protected] | @gmail |
[email protected] | @zoho |
[email protected] | @yahoo |
[email protected] | @onet |
La parte POSITION('.' IN email) - POSITION('@' IN email)
simplemente calcula la longitud de la subcadena.