Entrada

Funciones de cadena en SQL Server

En SQL Server, las funciones de cadena permiten manipular valores basados en cadenas de texto (incluyendo texto y alfanuméricos). También conocidas como “Funciones escalares de cadena”, las funciones de cadena toman uno o más valores de cadenas de texto como argumento y devuelven un valor de cadena modificado.

En SQL Server, cuando trabajamos con cadenas de texto, siempre debes usar comillas simples ' '. ¿Pero qué pasa si queremos incluir un carácter de comilla simple en el valor de la cadena? Bueno, en ese caso, debes escaparla duplicándola. Ejemplo:

1
SELECT 'Brian O''Conner' AS Nombre;

Resultado:

Nombre
Brian O'Conner

Usos principales de las funciones de cadena en T-SQL

Las funciones de cadena en SQL Server (Transact-SQL) son funciones escalares que operan sobre valores de tipo texto o que pueden convertirse a texto, y devuelven ya sea otra cadena o un número.

Estas funciones son fundamentales para:

  • Limpiar o formatear datos de texto
  • Extraer subcadenas
  • Reemplazar o dividir texto
  • Obtener la longitud o el valor numérico asociado a caracteres
  • Realizar agregaciones agrupadas sobre texto, etc.

La documentación oficial lista varias funciones con distintos propósitos: manipulación sencilla de caracteres, búsqueda, transformación, agregación, y otras más especializadas.

FunciónQué hace / uso principal
ASCIIDevuelve el código ASCII del primer carácter de una cadena.
CHARDevuelve el carácter correspondiente a un código ASCII.
CHARINDEXDevuelve la posición inicial de una subcadena dentro de otra cadena.
CONCATConcatena dos o más cadenas en una sola.
CONCAT_WSConcatena valores usando un separador especificado.
DIFFERENCECompara el valor SOUNDEX de dos cadenas y devuelve un número que mide su similitud fonética.
FORMATDevuelve una cadena con formato de número o fecha.
LEFTDevuelve los primeros n caracteres de una cadena.
LENDevuelve la longitud de una cadena (sin contar espacios finales).
LOWERConvierte una cadena a minúsculas.
LTRIMElimina los espacios en blanco a la izquierda de una cadena.
NCHARDevuelve el carácter Unicode correspondiente a un código entero.
PATINDEXDevuelve la posición inicial de un patrón dentro de una cadena.
QUOTENAMEDevuelve una cadena delimitada con corchetes o comillas dobles.
REPLACEReemplaza todas las apariciones de una subcadena dentro de una cadena.
REPLICATERepite una cadena un número especificado de veces.
REVERSEDevuelve la cadena en orden inverso.
RIGHTDevuelve los últimos n caracteres de una cadena.
RTRIMElimina los espacios en blanco a la derecha de una cadena.
SOUNDEXDevuelve el código SOUNDEX de una cadena para comparaciones fonéticas.
SPACEDevuelve una cadena compuesta por un número especificado de espacios.
STRConvierte un valor numérico en una cadena con formato.
STRING_AGGConcatena valores de filas en una cadena con un separador.
STRING_ESCAPEDevuelve una cadena con caracteres escapados (JSON, etc.).
STRING_SPLITDivide una cadena en filas, según un separador.
STUFFInserta una cadena dentro de otra en una posición especificada.
SUBSTRINGDevuelve una parte de la cadena, dada posición inicial y longitud.
TRANSLATESustituye caracteres específicos en una cadena según un mapeo.
TRIMElimina espacios iniciales y finales de una cadena.
UNICODEDevuelve el código Unicode del primer carácter de una cadena.
UPPERConvierte una cadena a mayúsculas.

Veamos un ejemplo sencillo usando la función UPPER, que convierte todo el texto a mayúsculas:

1
SELECT UPPER('hola mundo');

Ejercicios con funciones T-SQL de cadenas

Imaginemos que somos analistas de datos en Toretto’s Garage y necesitamos manipular y analizar información sobre el reparto y los vehículos de la primera película de Rápidos y Furiosos. Contamos con una base de datos que contiene información sobre los actores, personajes y sus icónicos vehículos.

Esquema de las tablas

Esquema de las tablas Esquema de la base de datos Script - setup

1. CONCAT() - Concatenar cadenas

Combinar marca y modelo del vehículo:

1
2
3
4
SELECT 
    CONCAT(brand, ' ', model) AS vehiculo_completo,
    year
FROM Vehicles;

Resultado:

vehiculo_completoyear
Mitsubishi Eclipse1995
Toyota Supra MK IV1994
Nissan 240SX1993
Acura Integra1990
Honda S20002000
Volkswagen Jetta1991
Chevrolet S-101998

2. UPPER() y LOWER() - Mayúsculas y minúsculas

Mostrar nombres en mayúsculas y vehículos en minúsculas:

1
2
3
4
5
6
7
SELECT 
    UPPER(actor_name) AS actor_mayusculas,
    LOWER(character_name) AS personaje_minusculas,
    brand,
    model
FROM Cast c
INNER JOIN Vehicles v ON c.cast_id = v.cast_id;

Resultado:

actor_mayusculaspersonaje_minusculasbrandmodel
VIN DIESELdominic torettoMitsubishiEclipse
PAUL WALKERbrian o’connerToyotaSupra MK IV
MICHELLE RODRIGUEZletty ortizNissan240SX
JORDANA BREWSTERmia torettoAcuraIntegra
RICK YUNEjohnny tranHondaS2000
CHAD LINDBERGjesseVolkswagenJetta
MATT SCHULZEvinceChevroletS-10

3. LEN() - Longitud de cadenas

Analizar longitud de nombres y modelos:

1
2
3
4
5
6
7
8
9
SELECT 
    actor_name,
    LEN(actor_name) AS longitud_nombre,
    character_name,
    LEN(character_name) AS longitud_personaje,
    model,
    LEN(model) AS longitud_modelo
FROM Cast c
INNER JOIN Vehicles v ON c.cast_id = v.cast_id;

Resultado:

actor_namelongitud_nombrePersonajelongitud_personajemodellongitud_modelo
Vin Diesel10Dominic Toretto15Eclipse7
Paul Walker11Brian O’Conner14Supra MK IV11
Michelle Rodriguez18Letty Ortiz11240SX5
Jordana Brewster16Mia Toretto11Integra7
Rick Yune9Johnny Tran11S20005
Chad Lindberg13Jesse5Jetta5
Matt Schulze12Vince5S-104

4. LEFT() y RIGHT() - Extraer subcadenas

Extraer primeras y últimas letras:

1
2
3
4
5
SELECT 
    actor_name,
    LEFT(actor_name, 3) AS primeras_3_letras,
    RIGHT(actor_name, 3) AS ultimas_3_letras
FROM Cast;

Resultado:

actor_nameprimeras_3_letrasultimas_3_letras
Vin DieselVinsel
Paul WalkerPauker
Michelle RodriguezMicuez
Jordana BrewsterJorter
Rick YuneRicune
Chad LindbergChaerg
Matt SchulzeMatlze

5. SUBSTRING() - Extraer por posición

Extraer partes específicas de los nombres:

1
2
3
4
5
6
SELECT 
    actor_name,
    SUBSTRING(actor_name, 1, 3) AS inicio_nombre,
    character_name,
    SUBSTRING(character_name, CHARINDEX(' ', character_name) + 1, LEN(character_name)) AS apellido_personaje
FROM Cast;

Resultado:

actor_nameinicio_nombrecharacter_nameapellido_personaje
Vin DieselVinDominic TorettoToretto
Paul WalkerPauBrian O’ConnerO’Conner
Michelle RodriguezMicLetty OrtizOrtiz
Jordana BrewsterJorMia TorettoToretto
Rick YuneRicJohnny TranTran
Chad LindbergChaJesseJesse
Matt SchulzeMatVinceVince

Para extraer el apellido correctamente, usamos una combinación de varias funciones:

1
2
3
SUBSTRING(character_name,
       CHARINDEX(' ', character_name) + 1,
       LEN(character_name)) AS apellido_personaje
  • CHARINDEX(' ', character_name) Busca la posición del primer espacio en el nombre del personaje. Ejemplo: para 'Dominic Toretto', devuelve 8 (el espacio entre “Dominic” y “Toretto”).
  • CHARINDEX(' ', character_name) + 1 Se suma 1 para empezar justo después del espacio, es decir, al inicio del apellido. Ejemplo: 8 + 1 = 9 → posición de la “T” de “Toretto”.
  • LEN(character_name) Devuelve la longitud total del nombre del personaje. Se usa como cantidad máxima de caracteres a tomar desde la posición indicada.

6. REPLACE() - Reemplazar texto

Reemplazar espacios por guiones:

1
2
3
4
5
SELECT 
    actor_name,
    REPLACE(actor_name, ' ', '-') AS personaje_con_guiones,
    REPLACE(character_name, ' ', '_') AS nombre_con_guion_bajo
FROM Cast;

Resultado:

actor_namepersonaje_con_guionesnombre_con_guion_bajo
Vin DieselVin-DieselDominic_Toretto
Paul WalkerPaul-WalkerBrian_O’Conner
Michelle RodriguezMichelle-RodriguezLetty_Ortiz
Jordana BrewsterJordana-BrewsterMia_Toretto
Rick YuneRick-YuneJohnny_Tran
Chad LindbergChad-LindbergJesse
Matt SchulzeMatt-SchulzeVince

7. CHARINDEX() - Encontrar posición

Encontrar posición del espacio en los nombres:

1
2
3
4
5
6
7
8
9
SELECT 
    actor_name,
    CHARINDEX(' ', actor_name) AS posicion_espacio,
    CASE 
        WHEN CHARINDEX(' ', actor_name) > 0 
        THEN LEFT(actor_name, CHARINDEX(' ', actor_name) - 1)
        ELSE actor_name
    END AS primer_nombre
FROM Cast;

Resultado:

actor_nameposicion_espacioprimer_nombre
Vin Diesel4Vin
Paul Walker5Paul
Michelle Rodriguez9Michelle
Jordana Brewster8Jordana
Rick Yune5Rick
Chad Lindberg5Chad
Matt Schulze5Matt

8. LTRIM() y RTRIM() - Eliminar espacios

Limpiar espacios en blanco:

1
2
3
4
5
6
7
8
9
10
11
12
WITH DatosProcesados AS (
  SELECT 
    actor_name,
    CONCAT('   ', actor_name, '   ') AS nombre_con_espacios
  FROM Cast
)

SELECT 
  actor_name,
  nombre_con_espacios,
  LTRIM(RTRIM(nombre_con_espacios)) AS nombre_limpio
FROM DatosProcesados;

Resultado:

Resultado consulta Resultado consulta

Usamos WITH (CTE - Common Table Expression) para crear una tabla temporal lógica que organiza el código en etapas para separar claramente la preparación de datos (agregar espacios) de la transformación (eliminar espacios).

9. STRING_AGG() - Agrupar cadenas (SQL Server 2017+)

Agrupar todos los modelos de vehículos por marca:

1
2
3
4
5
6
7
8
9
10
11
12
-- Añadimos más vehículos por marca para ver mejor el resultado
INSERT INTO Vehicles (cast_id, brand, model, year) VALUES
(2, 'Toyota', 'Celica', 1999),
(2, 'Toyota', 'MR2', 1990),
(5, 'Honda', 'Civic', 2000),
(5, 'Honda', 'Prelude', 1995);

SELECT 
    brand,
    STRING_AGG(model, ', ') AS modelos_agrupados
FROM Vehicles
GROUP BY brand;

Resultado:

brandmodelos_agrupados
AcuraIntegra
ChevroletS-10
HondaCivic, Prelude, S2000
MitsubishiEclipse
Nissan240SX
ToyotaSupra MK IV, Celica, MR2
VolkswagenJetta

Las funciones de cadena en SQL Server son esenciales para manipular y transformar datos textuales. En nuestro escenario práctico, hemos visto cómo aplicar estas funciones para:

  • Formatear nombres y modelos de vehículos
  • Extraer información específica de cadenas
  • Crear identificadores únicos
  • Limpiar y estandarizar datos

Estas habilidades son cruciales para cualquier profesional que trabaje con bases de datos, permitiendo transformar datos crudos en información valiosa y bien estructurada.

Vin Diesel

¡Recuerda! La familia no son solo los que comparten tu sangre, sino también los que dominan las funciones de cadena en SQL. ❤️

#SQLFamily #FastAndFurious #DatabaseDrift
Esta entrada está licenciada bajo CC BY 4.0 por el autor.