ما هي أفضل طريقة للاستفادة من الحرف الأول من كل كلمة في سلسلة في SQL Server

StackOverflow https://stackoverflow.com/questions/55054

  •  09-06-2019
  •  | 
  •  

سؤال

ما هي أفضل طريقة للاستفادة من الحرف الأول من كل كلمة في سلسلة في SQL Server.

هل كانت مفيدة؟

المحلول

من 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

هناك أبسط/أصغر واحد هنا (ولكن لا يعمل إذا كان أي صف لا تحتوي على مسافات غير صالح "طول المعلمة مرت على يمين وظيفة."):

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

نصائح أخرى

الاختلاف من واحد لقد تم استخدام لبعض الوقت:

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

يمكنك بسهولة تعديل التعامل مع الشخصيات بعد البنود الأخرى من المساحات إذا أردت.

حل آخر بدون استخدام حلقة نقية تعيين النهج القائم على أساس متكررة مع 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

هنا هو أبسط من سطر واحد من رمز.

select 
        LEFT(column, 1)+ lower(RIGHT(column, len(column)-1) )
     from [tablename]

إذا كنت تبحث عن الإجابة على نفس السؤال في أوراكل/PLSQL ثم يمكنك استخدام وظيفة INITCAP.وفيما يلي مثال على السمة dname من الجدول قسم التي لديها القيم ('البيع', 'إدارة', 'إنتاج', 'التنمية').

SQL> select INITCAP(dname) from department;

INITCAP(DNAME)
--------------------------------------------------
Sales
Management
Production
Development

كما دالة قيم الجدول:

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.

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

نهاية

اللغة الإنجليزية فقط البيانات.

سوبر عدم كفاءة من وجهة نظر كفاءة الأداء ولكن من وجهة نظر إنتاجية.استخدامه مرة واحدة converter:

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

كنت أبحث عن أفضل طريقة للاستفادة وأنا إعادة بسيط النصي sql

كيفية استخدام حدد dbo.Capitalyze('هذا هو اختبار مع العديد من المساحات')

نتيجة "هذا هو اختبار مع العديد من المساحات"

إنشاء وظيفة Capitalyze(@الإدخال 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

نهاية

الأول هو اسم العمود إذا كان الأول قيمة أخيل ثم العلوي(يسار(الأول,1)) توفر رأس المال أول حرف(أ) و فرعية وظيفة فرعية(الأول,2,LEN(الأول)) تقديم(خيل) concate على حد سواء باستخدام + ثم النتيجة (أخيل)

select UPPER(left(fname,1))+SUBSTRING(fname,2,LEN(fname)) as fname
FROM [dbo].[akhil]

يجب أن تحاول هذا بدلا من ذلك

Select INITCAP(column_name) from table_name;

وهذا الحرف الأول من ذكر الصفات الإدخالات.

IF OBJECT_ID ('dbo.fnCapitalizeFirstLetterAndChangeDelimiter') IS NOT NULL
    DROP FUNCTION dbo.fnCapitalizeFirstLetterAndChangeDelimiter
GO

CREATE FUNCTION [dbo].[fnCapitalizeFirstLetterAndChangeDelimiter] (@string NVARCHAR(MAX), @delimiter NCHAR(1), @new_delimeter NCHAR(1))
RETURNS NVARCHAR(MAX)
AS 
BEGIN
    DECLARE @result NVARCHAR(MAX)
    SELECT @result = '';
    IF (LEN(@string) > 0)
        DECLARE @curr INT
        DECLARE @next INT
        BEGIN
            SELECT @curr = 1
            SELECT @next = CHARINDEX(@delimiter, @string)
            WHILE (LEN(@string) > 0)
                BEGIN
                    SELECT @result = 
                        @result + 
                        CASE WHEN LEN(@result) > 0 THEN @new_delimeter ELSE '' END +
                        UPPER(SUBSTRING(@string, @curr, 1)) + 
                        CASE 
                            WHEN @next <> 0 
                            THEN LOWER(SUBSTRING(@string, @curr+1, @next-2))
                            ELSE LOWER(SUBSTRING(@string, @curr+1, LEN(@string)-@curr))
                        END
                    IF (@next > 0)
                        BEGIN
                            SELECT @string = SUBSTRING(@string, @next+1, LEN(@string)-@next)
                            SELECT @next = CHARINDEX(@delimiter, @string)
                        END
                    ELSE
                        SELECT @string = ''
                END
        END
    RETURN @result
END
GO
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top