Posts Tagged ‘oracle’

4 05
10
2010

Letra Capital Con SQL

Martes, octubre 5th, 2010

Cuando hablamos de letra capital, estamos hablando del estilo de texto en el que la primera letra de cada palabra aparece en mayúscula, y el resto de la palabra, en minúscula.

Es Decir, Algo Como Esta Frase Que Estás Leyendo Ahora Mismo, O Como El Título De Este Post.

Esto puede ser útil por ejemplo para formatear nombres propios de personas, o por ejemplo, nombres de ciudades: Gran Canaria.

En algunos lenguajes de programación,  existen funciones ya predefinidas que te ofrecen esta posibilidad (como por ejemplo ucwords en PHP), pero … ¿y en lenguaje SQL?

En motores de gestión de base de datos como Oracle, contamos con una función predefinida que convierte a mayúsculas el primer caracter de cada palabra de una cadena: InitCap.

Sin embargo, en otros sistemas de gestión de base de datos como MySql o SqlServer, tendremos que “buscarnos la vida“.

A continuación veremos 2 funciones que nos permitirán modificar nuestras cadenas de texto combinando MAYÚSCULAS y minúsculas directamente en nuestras consultas SQL.

La idea es sencilla: recorreremos la cadena de texto letra por letra en búsqueda de espacios en blanco o cualquier otro carácter separador, marcando con ayuda de una bandera o flag, la indicación de que debemos convertir la siguiente letra en mayúscula.

Letra Capital / Mayúscula-Minúscula En MYSQL

DELIMITER $$

DROP FUNCTION IF EXISTS `test`.`UCWORDS` $$
CREATE FUNCTION `test`.`UCWORDS` (input VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
  -- Declaración de variables
  DECLARE i INT DEFAULT 0;
  DECLARE length INT;
  DECLARE flag TINYINT DEFAULT 1;
  DECLARE output VARCHAR(255) DEFAULT '';

  -- Para evitar sorpresas, pasamos toda la cadena de texto a minúsculas
  SET input = LOWER(input);
  -- Guardamos la longitud de la cadena a recorrer para utilizarla a continuación
  SET length = LENGTH(input);

  -- Recorremos toda la cadena de texto
  WHILE (i <= length) DO
    IF (flag=1) THEN
      -- El flag estaba activado, lo que significa que habíamos encontrado un espacio en blanco y debemos pasar a mayúscula el carácter actual.
      SET output = CONCAT(output, UPPER(MID(input, i, 1)));
      SET flag = 0;
    ELSE
      SET output = CONCAT(output, MID(input, i, 1));
    END IF;
    IF (MID(input, i, 1) IN (' ', ',', ';', '.', ':', '!', '?', '_', '-', '/', '&', '''', '(', ')')) THEN
      -- Hemos encontrado un espacio en blanco, por lo que activamos nuestra bandera para la próxima iteración.
      SET flag = 1;
    END IF;
    SET i = i+1;
  END WHILE;

  RETURN output;

END $$

DELIMITER ;

Letra Capital / Mayúscula-Minúscula En SQLSERVER


-- =============================================
-- Author:		v3rgu1.com
-- Description:	Función que permite capitalizar
--              un String
-- =============================================
ALTER FUNCTION [dbo].[InitCap]
(
	-- Parámetros
	@INPUT AS VARCHAR(4000)
)
RETURNS VARCHAR(4000)
AS
BEGIN
	-- Declaración de variables
	DECLARE @I AS INT
	DECLARE @LENGTH AS INT
	DECLARE @FLAG AS BIT
	DECLARE @OUTPUT AS VARCHAR(4000)

	-- Inicializamos el contador a 0
	SET @I = 0;
	-- Para evitar sorpresas, pasamos toda la cadena de texto a minúsculas
	SET @INPUT = LOWER(@INPUT);
	-- Guardamos la longitud de la cadena a recorrer para utilizarla a continuación
	SET @LENGTH = LEN(@INPUT);
	-- Inicializamos la bandera como activa para capitalizar la primera letra de la cadena
	SET @FLAG = 1;
	SET @OUTPUT = '';

	-- Recorremos toda la cadena de texto
	WHILE (@I <= @LENGTH) BEGIN
		IF (@FLAG = 1) BEGIN
			-- El flag estaba activado, lo que significa que habíamos encontrado un espacio en blanco y debemos pasar a mayúscula el carácter actual.
			SET @OUTPUT = @OUTPUT + UPPER(SUBSTRING(@INPUT, @I, 1));
			SET @FLAG = 0;
		END ELSE BEGIN
			SET @OUTPUT = @OUTPUT + SUBSTRING(@INPUT, @I, 1);
		END
		IF (SUBSTRING(@INPUT, @I, 1) IN (' ', ',', ';', '.', ':', '!', '?', '_', '-', '/', '&', '''', '(', ')')) BEGIN
			-- Hemos encontrado un espacio en blanco o algún caracter separados,
			-- por lo que activamos nuestra bandera para la próxima iteración.
			SET @FLAG = 1;
		END
		SET @I = @I + 1;
	END -- WHILE

	RETURN @OUTPUT
END