Quiero poner en mayúscula solo la primera letra de cada palabra de cada oración en una columna SQL.
Por ejemplo, si la oración es:
'Me gustan las películas'
entonces necesito la salida:
'Me gustan las películas'
Consulta:
declare @a varchar(15)
set @a = 'qWeRtY kEyBoArD'
select @a as [Normal text],
upper(@a) as [Uppercase text],
lower(@a) as [Lowercase text],
upper(left(@a,1)) + lower(substring(@a,2,len(@a))) as [Capitalize first letter only]
Aquí escribí mayúscula, minúscula y mayúscula la primera letra solo en mi columna (aquí pongo solo una palabra al azar).
Aquí están mis resultados:
¿Hay alguna posibilidad de hacer eso?
¿Alguna posibilidad de obtener resultados sin usar la función definida por el usuario?
Necesito la salida Qwerty Keyboard
sql-server
sql-server-2014
Marin Mohanadas
fuente
fuente
Respuestas:
Primero convierte la cadena a XML reemplazando todos los espacios con la etiqueta vacía
<X/>
. Luego tritura el XML para usar una palabra por filanodes()
. Para que las filas vuelvan a un valor, utiliza elfor xml path
truco.fuente
for xml path
truco para la concatenación. A menos que elija CLR, que sería la mejor opción si la velocidad y la eficiencia son importantes.En SQL Server 2016 puede hacer esto con R, p. Ej.
Si debería o no es una pregunta diferente :)
fuente
Tal vez estoy siendo tonto, pero comprobando la consulta a continuación que he escrito en contra de algunos de los proporcionados, esto parece ser un poco más eficiente (dependiendo de la indexación).
El código es un poco estúpido, pero no hay un dicho que diga que si parece estúpido pero funciona, entonces no es estúpido.
fuente
Otra opción es manejar esto a través de SQLCLR. Incluso hay un método disponible en .NET que hace esto: TextInfo.ToTitleCase (in
System.Globalization
). Este método pondrá en mayúscula la primera letra de cada palabra y en minúscula las letras restantes. A diferencia de las otras propuestas aquí, también omite las palabras en mayúsculas, asumiendo que son siglas. Por supuesto, si se desea este comportamiento, sería bastante fácil actualizar cualquiera de las sugerencias de T-SQL para hacerlo también.Una ventaja del método .NET es que puede poner letras mayúsculas que son caracteres suplementarios. Por ejemplo: DESERET SMALL LETTER OW tiene una asignación en mayúsculas de DESERET CAPITAL LETTER OW (ambas aparecen como cuadros cuando las pego aquí) , pero la
UPPER()
función no cambia la versión en minúsculas a mayúsculas, incluso cuando La clasificación predeterminada para la base de datos actual está establecida enLatin1_General_100_CI_AS_SC
. Esto parece coherente con la documentación de MSDN que no aparece en la listaUPPER
yLOWER
en el cuadro de funciones que se comportan de manera diferente cuando se utiliza una_SC
Clasificación: Compatibilidad y Soporte Unicode: Caracteres suplementarios .Devoluciones (ampliada para que pueda ver el carácter suplementario):
Puede ver la lista completa (y actual) de caracteres en minúsculas y cambiar a mayúsculas usando la siguiente función de búsqueda en Unicode.org (puede ver los caracteres suplementarios desplazándose hacia abajo hasta llegar al "DESIERTO" sección, o simplemente presiona Control-Fy busca esa palabra):
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5B%3AChanges_When_Titlecased%3DYes%3A%5D
Aunque, para ser sincero, este no es un gran beneficio, ya que es dudoso que alguien esté usando alguno de los Personajes suplementarios que pueden estar en mayúsculas. De cualquier manera, aquí está el código SQLCLR:
Aquí está la sugerencia de @MikaelEriksson, modificada ligeramente para manejar
NVARCHAR
datos y omitir palabras en mayúsculas (para que coincida más estrechamente con el comportamiento del método .NET), junto con una prueba de esa implementación T-SQL y de La implementación de SQLCLR:Otra diferencia en el comportamiento es que esta implementación particular de T-SQL se divide solo en espacios, mientras que el
ToTitleCase()
método considera que la mayoría de las no letras son separadores de palabras (de ahí la diferencia en el manejo de la parte "uno y DOS").Ambas implementaciones manejan secuencias combinadas correctamente. Cada una de las letras acentuadas en "üvÜlA" se compone de una letra base y una diéresis / diéresis combinadas (los dos puntos sobre cada letra), y se convierten correctamente al otro caso en ambas pruebas.
Finalmente, una desventaja inesperada de la versión SQLCLR es que al realizar varias pruebas, encontré un error en el código .NET relacionado con su manejo de las letras en círculo (que ahora se ha informado en Microsoft Connect - ACTUALIZACIÓN: Connect ha sido se movió a
/dev/null
, literalmente, por lo que es posible que deba volver a enviar esto si el problema persiste). La biblioteca .NET trata las letras en círculo como separadores de palabras, por lo que no convierte la "ⓐDD" en "Ⓐdd" como debería.FYI
Una función SQLCLR pre-realizada que encapsula el
TextInfo.ToTitleCase
método mencionado anteriormente ahora está disponible en la versión gratuita de SQL # (que escribí) como String_ToTitleCase y String_ToTitleCase4k .😺
fuente
Como alternativa a la respuesta de Mikael Eriksson , podría considerar usar el manejo patentado de T-SQL de la configuración de variables en sentencias de selección de varias filas.
En SQL Server, cuando se establece una variable como parte de una instrucción SELECT, cada fila ejecutará una iteración de la lógica establecida.
La gente a menudo usa este método para concatenar cadenas, aunque no es compatible y hay algunos problemas documentados oficialmente con él . El problema oficial se relaciona con las características particulares de ORDER BY, y no necesitamos eso aquí, por lo que quizás sea una opción segura.
Aquí, iteramos sobre las 26 letras del alfabeto y las reemplazamos con una versión en mayúscula si están precedidas por un espacio. (Preparamos la cadena inicialmente escribiendo en mayúscula la primera letra y haciendo el resto en minúscula, como lo hizo en su pregunta).
El SQL es un poco complejo porque requiere el uso de una Tabla de conteo, una tabla de números, para generar las 26 iteraciones de reemplazo que está haciendo. Puede hacer una práctica función definida por el usuario (TVF) con valores de tabla en línea para producir esa tabla de números o incluso podría usar una tabla física.
Un inconveniente de esta opción es que no puede ser parte de un TVF en línea, ya que debe implicar el establecimiento de una variable. Entonces, si quisiera aplicar este método a una columna de su salida, necesitaría envolverlo en un TVF de múltiples declaraciones o en una función escalar definida por el usuario.
Sin embargo, su plan de consulta es mucho más simple y probablemente es significativamente más rápido que el método XML. También podría argumentar que es más fácil de entender (especialmente si tiene su propia tabla de conteo).
(Probé esto usando una cadena mucho más grande y era de aproximadamente 6 ms frente a 14 ms para la solución XML).
Existen varias limitaciones adicionales con esta solución. Tal como está escrito, supone una intercalación que no distingue entre mayúsculas y minúsculas, aunque podría eliminar ese problema especificando una intercalación o ejecutando LCASE en el término de búsqueda, a costa de algún rendimiento. También solo aborda las letras ASCII estándar y se basa en su ubicación en el conjunto de caracteres , por lo que no haría nada con ñ.
fuente
Suponiendo que solo está buscando capitalizar las palabras después de un espacio, aquí hay otra forma de hacerlo.
fuente
Puede que no sea a prueba de balas, pero espero que sea una contribución útil a este hilo.
fuente
A continuación se muestra el procedimiento que utilicé en una base de datos Firebird para hacer esto. Probablemente se pueda limpiar mucho, pero hizo el trabajo por mí.
fuente
Los CTE recursivos son bastante buenos para este tipo de cosas.
Probablemente no sea particularmente eficiente para operaciones grandes, pero permite este tipo de operación en una declaración de selección SQL pura:
Salida:
fuente
Me gusta esta version Es simple y puede usarse para crear una función, solo tiene que tener la versión correcta de SQL Server:
fuente
Espero te ayude ...
fuente
Datos de prueba
Implementación
fuente