Каков наилучший способ использовать первую букву каждого слова в строке в SQL Server - PullRequest
44 голосов
/ 10 сентября 2008

Как лучше всего использовать первую букву каждого слова в строке в SQL Server.

Ответы [ 11 ]

70 голосов
/ 10 сентября 2008

С 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

Здесь есть более простой / меньший вариант (но он не работает, если в какой-либо строке нет пробелов, «Недопустимый параметр длины, переданный функции RIGHT.»):

http://www.devx.com/tips/Tip/17608

1 голос
/ 27 октября 2018

Если вы ищете ответ на тот же вопрос в Oracle / PLSQL, вы можете использовать функцию INITCAP. Ниже приведен пример атрибута dname из таблицы отдел , который имеет значения («продажи», «управление», «производство», «разработка»).

SQL> select INITCAP(dname) from department;

INITCAP(DNAME)
--------------------------------------------------
Sales
Management
Production
Development
1 голос
/ 23 июля 2015

Вот самый простой однострочный код.

select 
        LEFT(column, 1)+ lower(RIGHT(column, len(column)-1) )
     from [tablename]
1 голос
/ 02 января 2015

Другое решение без использования цикла - чистый подход на основе множеств с рекурсивным CTE

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
1 голос
/ 10 сентября 2008

Вариант того, который я использовал довольно долгое время:

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

Вы можете легко изменить обработку символов после элементов, отличных от пробелов, если хотите.

0 голосов
/ 03 октября 2018

fname - это имя столбца, если значение fname равно akhil, тогда UPPER (left (fname, 1)) предоставляют заглавную первую букву (A), а функция подстроки SUBSTRING (fname, 2, LEN (fname)) обеспечивает (khil) объединение обоих с + тогда результат (ахил)

select UPPER(left(fname,1))+SUBSTRING(fname,2,LEN(fname)) as fname
FROM [dbo].[akhil]
0 голосов
/ 12 сентября 2018

Я искал лучший способ заработать, и я воссоздаю простой сценарий SQL

как использовать SELECT dbo.Capitalyze («это тест с несколькими пробелами»)

результат "Это тест с несколькими пробелами"

СОЗДАТЬ ФУНКЦИЮ Capitalyze (@input varchar (100)) возвращает varchar (100) как начать

declare @index int=0
declare @char as varchar(1)=' '
declare @prevCharIsSpace as bit=1
declare @Result as varchar(100)=''

set @input=UPPER(LEFT(@input,1))+LOWER(SUBSTRING(@input, 2, LEN(@input)))
set @index=PATINDEX('% _%',@input)
if @index=0
    set @index=len(@input)
set @Result=substring(@input,0,@index+1)

WHILE (@index < len(@input))
BEGIN
    SET @index = @index + 1
    SET @char=substring(@input,@index,1)
    if (@prevCharIsSpace=1)
    begin
        set @char=UPPER(@char)
        if (@char=' ')
            set @char=''
    end

    if (@char=' ')
        set @prevCharIsSpace=1
    else
        set @prevCharIsSpace=0

    set @Result=@Result+@char
    --print @Result
END
--print @Result
return @Result

конец

0 голосов
/ 26 июня 2018

Только для данных на английском языке.

Супер неэффективно с точки зрения производительности, но эффективно с точки зрения производительности. Используйте его как одноразовый конвертер:

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
0 голосов
/ 11 декабря 2017
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

END

0 голосов
/ 21 сентября 2017

Как табличная функция:

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

Обратите внимание, что string_split требует COMPATIBILITY_LEVEL 130.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...