Blog gratis
Reportar
Editar
¡Crea tu blog!
Compartir
¡Sorpréndeme!
img
img

 

 

SQL Server
Blog. (Apuntes y Recopilaciones) por Norman M. Pardell

img
img
20 de Abril, 2011 · FuncionesEscalares

Funciones escalares o de cadena. Dar formato en la salida de consultas. SQL Server

 Hay funciones escalares que realizan una operación sobre un valor de cadena de entrada y devuelven un valor de cadena alterado o un valor numérico. Solo realizaré unos cuantos ejemplos, mostrando como se puede trabajar con algunas de las funciones de cadena, también os pasaré un enlace para que tengáis acceso a todas ellas.

 

 A la hora de dar formato en la salida de las consultas, el origen de datos (bbdd) no es el mejor sitio donde hacer esto, en cualquier caso poderse, se puede:

 Con UPPER puedes convertir una expresión de datos tipo caracteres (una constante, una variable o una columna de datos binarios o de caracteres), a mayúsculas.

 La cadena de caracteres, tratada por UPPER, debe ser de un tipo de datos que se pueda convertir implícitamente a varchar. De lo contrario, utilice CAST para convertir la cadena de caracteres a varchar explicitamente.

 Por ejemplo:

SELECT UPPER([Apellido Paterno] + ' ' + UPPER([Apellido Materno]

 En otro ejemplo se utiliza las funciones UPPER y RTRIM para devolver el apellido de las personas de la tabla “Person” de manera que aparezca en mayúsculas, desechando los espacios finales y concatenado al nombre.

Select UPPER(RTRIM(LastName)) + ', ' + FirstName AS Name

FROM Person.Person

ORDER BY LastName;

go

 

RTRIM: Devuelve una cadena de caracteres después de truncar todos los espacios en blanco finales

LTRIM: Devuelve una expresión de caracteres tras quitar todos los espacios iniciales en blanco.

SPACE: Añade un número de espacios indicados, entre 2 cadenas de caracteres. Para incluir espacios en datos Unicode o para devolver más de 8.000 espacios de caracteres, utilice REPLICATE en lugar de SPACE.

 En el ejemplo siguiente se eliminan los espacios posteriores de los apellidos y se concatena una coma, y dos espacios antes de los nombres de las personas que aparecen en la tabla “Person”:

 

SELECT RTRIM(LastName) + ',' + SPACE(2) +  LTRIM(FirstName)

FROM Person.Person

ORDER BY LastName, FirstName;

GO

 

LOWER: puedes convertir una expresión de datos tipo caracteres (una constante, una variable o una columna de datos binarios o de caracteres), a minúsculas.

SUBSTRING: Devuelve únicamente una parte de una cadena de caracteres indicados. Por ejemplo, podemos ver en esta consulta como devuelve el primer apellido completo en una columna y solamente la primera inicial del segundo apellido en la segunda columna, filtramos el primer apellido para que solo muestren los que comienzan por "Barl"

 

 

GO

SELECT LastName, SUBSTRING(FirstName, 1, 1) AS Initial

FROM Person.Person

WHERE LastName like 'Barl%'

ORDER BY LastName;

 

El conjunto de resultados es el siguiente.

LastName Initial

----------------

Barley R

Barlow B

(2 filas afectadas)

 

 Juguemos, un poco con la salida de datos:

 En algunos casos no habiendo una función "estándar" que proporcione lo dehesado, hay que trabajar un poquito más (siempre vamos a intentar evitar cursores y recorridos uno a uno de los caracteres).

 Vamos a intentar mostrar un campo, el cual tiene nombre compuestos, queremos obtener la primera letra de cada nombre en mayúsculas y el resto del nombre en minúsculas. Por ejemplo, si tenemos un campo tal que así: carlos Jesús, que remos obtener: Carlos Jesús. O si tenemos: carlos JESÚS, queremos obtener Carlos Jesús…

 Primero creamos y rellenamos una tabla con los números del 1 al 1001, nos hará falta para encontrar los espacios.

create table numeros (num int);

 

 with nuns(num) as

 ( select 1 as num

 union all

 select num+1 from nuns where num<1000)

 insert into numeros

 select * from nums option (maxrecursion 0)

  

Luego separamos la palabra en letras

select * from (select 'hola pepe' cadena) a cross join numeros n where LEN(cadena)>=num

 Con la query anterior conseguimos tantas filas como letras 

 Con esta otra, obtenemos solo las letras

select SUBSTRING(cadena,num,1) from (select 'hola pepe' cadena) a cross join numeros n where LEN(cadena)>=num

Con este ponemos como mayúsculas (en la segunda columna tanto la primera como las que antes tienen un espacio

select SUBSTRING(cadena,num,1),

 case when num=1 or SUBSTRING(cadena,num-1,1)=' ' then UPPER(substring(cadena,num,1)) else LOWER(substring(cadena,num,1)) end from (select 'hola pepe' cadena) a

 cross join numeros n where LEN(cadena)>=num

 

 A hora lo convertimos en un xml para que aparezca de nuevo en una sola fila:

 select

 case when num=1 or SUBSTRING(cadena,num-1,1)=' ' then UPPER(substring(cadena,num,1)) else LOWER(substring(cadena,num,1)) end as a from (select 'hola pepe' cadena) a

 cross join numeros n where LEN(cadena)>=num

 for xml raw

 Y por último, y si esto lo tratamos como un string y le quitamos todos los tags xml?

select replace( replace (

 (

 select

 case when num=1 or SUBSTRING(cadena,num-1,1)=' ' then UPPER(substring(cadena,num,1)) else LOWER(substring(cadena,num,1)) end as a from (select 'hola pepe' cadena) a

 cross join numeros n where LEN(cadena)>=num

 for xml raw

 ) ,'<row a="',''),'"/>','') a

 

Ahora si sustituimos el 'hola pepe' cadena por nuestro campo, conseguiremos lo que queremos.

Se que parece muy complicado, de hecho... lo es. Pero también será rápido.

 

Lectura recomendada: Funciones de cadena (Transact-SQL)  

 Otra opción es tratar la salida, con el lenguaje en que este desarrollado la aplicación:

Por ejemplo, si es VB, C#, C++, F# o JScript... Mira este enlace: String.ToUpperInvariant (Método). ("Selecciona la versión de .NET Framework con la que trabajes"). -> Devuelve una cadena convertida en mayúsculas

 

Apunte y recopilación por Norman M. Pardell

Puedes consultarme, si deseas cualquier aclaración, pregunta o sugerencia en: Contacto, contestaré tan pronto como me sea posible.

publicado por normanmpardell a las 16:00 · Sin comentarios  ·  Recomendar
Comentarios (0) ·  Enviar comentario
Esta entrada no admite comentarios.
img
.Sobre mí
FOTO

Norman M. Pardell

MCITP: Database Administrator & Database Developer, SQL Server 2008. MCC Award Certificate. Consultor Senior de bases de datos en Capgemini España, S.L. Asesoramiento en implementación, desarrollo y gestión de bases de datos en grandes compañías. Actualmente, asignado a proyecto en compañía líder en el sector energético global. Más de 10 años trabajando con SQL Server (y otros gestores de BBDD)

» Ver perfil

img
.Secciones
» Inicio
img
.Enlaces
» Microsoft MSDN Foros
» Windows Server 2012
img
.Más leídos
» Asignar la cantidad correcta de Memoria para SQL Server
» Base de Datos Sospechosa (Suspect)
» Como modificar la Intercalación (Collation) en SQL Server
» Detectar bloqueos. SQL Server V.2005 y superiores
» Funciones SQL Server. Funciones escalares y funciones con valores de tabla.
» Integridad y corrupción en las bases de datos: DBCC CHECKDB
» Log de transacciones ( .ldf ). SQL Server.
» Migrando SQL Server 2005, 2008, 2008 R2 a SQL Server 2012
» Tomo I. Memoria RAM. Optimización de sistemas de 32 y 64 bits. SQL Server 2008.
» Transacciones activas. SQL server 2008
img
.Nube de tags [?]
                                                           
img img
FULLServices Network | Crear blog | Privacidad