primera - sql pasar a mayuscula
¿Cuál es la mejor manera de poner en mayúscula la primera letra de cada palabra en una cadena en SQL Server? (8)
¿Cuál es la mejor manera de poner en mayúscula la primera letra de cada palabra en una cadena en SQL Server.
Aquí está el código de una línea más simple.
select
LEFT(column, 1)+ lower(RIGHT(column, len(column)-1) )
from [tablename]
Como una función de valor de tabla:
CREATE FUNCTION dbo.InitCap(@v AS VARCHAR(MAX))
RETURNS TABLE
AS
RETURN
WITH a AS (
SELECT (
SELECT UPPER(LEFT(value, 1)) + LOWER(SUBSTRING(value, 2, LEN(value))) AS ''data()''
FROM string_split(@v, '' '')
FOR XML PATH (''''), TYPE) ret)
SELECT CAST(a.ret AS varchar(MAX)) ret from a
GO
Tenga en cuenta que string_split
requiere COMPATIBILITY_LEVEL
130.
Deberías probar esto en su lugar
Select INITCAP(column_name) from table_name;
Esto capitalizará la primera letra de las entradas de atributos mencionados.
Desde http://www.sql-server-helper.com/functions/initcap.aspx
CREATE FUNCTION [dbo].[InitCap] ( @InputString varchar(4000) )
RETURNS VARCHAR(4000)
AS
BEGIN
DECLARE @Index INT
DECLARE @Char CHAR(1)
DECLARE @PrevChar CHAR(1)
DECLARE @OutputString VARCHAR(255)
SET @OutputString = LOWER(@InputString)
SET @Index = 1
WHILE @Index <= LEN(@InputString)
BEGIN
SET @Char = SUBSTRING(@InputString, @Index, 1)
SET @PrevChar = CASE WHEN @Index = 1 THEN '' ''
ELSE SUBSTRING(@InputString, @Index - 1, 1)
END
IF @PrevChar IN ('' '', '';'', '':'', ''!'', ''?'', '','', ''.'', ''_'', ''-'', ''/'', ''&'', '''''''', ''('')
BEGIN
IF @PrevChar != '''''''' OR UPPER(@Char) != ''S''
SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char))
END
SET @Index = @Index + 1
END
RETURN @OutputString
END
GO
Aquí hay uno más simple / más pequeño (pero no funciona si una fila no tiene espacios, "Parámetro de longitud inválido pasado a la función DERECHA"):
Otra solución sin utilizar el bucle: enfoque basado en conjuntos puros con CTE recursivo
create function [dbo].InitCap (@value varchar(max))
returns varchar(max) as
begin
declare
@separator char(1) = '' '',
@result varchar(max) = '''';
with r as (
select value, cast(null as varchar(max)) [x], cast('''' as varchar(max)) [char], 0 [no] from (select rtrim(cast(@value as varchar(max))) [value]) as j
union all
select right(value, len(value)-case charindex(@separator, value) when 0 then len(value) else charindex(@separator, value) end) [value]
, left(r.[value], case charindex(@separator, r.value) when 0 then len(r.value) else abs(charindex(@separator, r.[value])-1) end ) [x]
, left(r.[value], 1)
, [no] + 1 [no]
from r where value > '''')
select @result = @result +
case
when ascii([char]) between 97 and 122
then stuff(x, 1, 1, char(ascii([char])-32))
else x
end + @separator
from r where x is not null;
set @result = rtrim(@result);
return @result;
end
Para datos solo en inglés.
Súper no eficiente desde el punto de vista del rendimiento pero eficiente desde la vista de la productividad. Úselo como convertidor de una sola vez:
SELECT
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
UPPER(LEFT(City,1))+LOWER(SUBSTRING(City,2,LEN(City)))
,'' a'', '' A'')
,'' b'', '' B'')
,'' c'', '' C'')
,'' d'', '' D'')
,'' e'', '' E'')
,'' f'', '' F'')
,'' g'', '' G'')
,'' h'', '' H'')
,'' i'', '' I'')
,'' j'', '' J'')
,'' k'', '' K'')
,'' l'', '' L'')
,'' m'', '' M'')
,'' n'', '' N'')
,'' o'', '' O'')
,'' p'', '' P'')
,'' q'', '' Q'')
,'' r'', '' R'')
,'' s'', '' S'')
,'' t'', '' T'')
,'' u'', '' U'')
,'' v'', '' V'')
,'' w'', '' W'')
,'' x'', '' X'')
,'' y'', '' Y'')
,'' z'', '' Z'')
FROM [Dictionaries].[dbo].[Cities]
WHERE Country = ''US'' AND City like ''% %''
ORDER BY City
Una variación de la que he estado usando durante bastante tiempo es:
CREATE FUNCTION [widget].[properCase](@string varchar(8000)) RETURNS varchar(8000) AS
BEGIN
SET @string = LOWER(@string)
DECLARE @i INT
SET @i = ASCII(''a'')
WHILE @i <= ASCII(''z'')
BEGIN
SET @string = REPLACE( @string, '' '' + CHAR(@i), '' '' + CHAR(@i-32))
SET @i = @i + 1
END
SET @string = CHAR(ASCII(LEFT(@string, 1))-32) + RIGHT(@string, LEN(@string)-1)
RETURN @string
END
Puede modificar fácilmente para manejar caracteres después de elementos que no sean espacios si lo desea.
BEGIN
DECLARE @string varchar(100) = ''asdsadsd asdad asd''
DECLARE @ResultString varchar(200) = ''''
DECLARE @index int = 1
DECLARE @flag bit = 0
DECLARE @temp varchar(2) = ''''
WHILE (@Index <LEN(@string)+1)
BEGIN
SET @temp = SUBSTRING(@string, @Index-1, 1)
--select @temp
IF @temp = '' '' OR @index = 1
BEGIN
SET @ResultString = @ResultString + UPPER(SUBSTRING(@string, @Index, 1))
END
ELSE
BEGIN
SET @ResultString = @ResultString + LOWER(SUBSTRING(@string, @Index, 1))
END
SET @Index = @Index+ 1--increase the index
END
SELECT @ResultString
FIN