এসকিউএল সার্ভারে প্রতিটি বাক্যের প্রতিটি শব্দের প্রথম অক্ষরকেই মূলধন করুন


18

আমি একটি এসকিউএল কলামে প্রতিটি বাক্যের প্রতিটি শব্দের প্রথম অক্ষরকে মূলধন করতে চাই।

উদাহরণস্বরূপ, যদি বাক্যটি হয়:

'আমি চলচ্চিত্র পছন্দ করি'

তারপরে আমার আউটপুটটি দরকার:

'আমি চলচ্চিত্র পছন্দ করি'

প্রশ্ন:

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]

এখানে আমি কেবলমাত্র আমার কলামে প্রথম অক্ষর উপরের, নীচের এবং মূলধনকে সম্পাদন করেছি (এখানে আমি কেবল একটি এলোমেলো শব্দ রেখেছি)।

আমার ফলাফলগুলি এখানে:

এখানে চিত্র বর্ণনা লিখুন

এটি করার কোনও সম্ভাবনা আছে কি?

ব্যবহারকারীর সংজ্ঞায়িত ফাংশন ব্যবহার না করে ফলাফল পাওয়ার কোনও সম্ভাবনা?

আমার আউটপুট দরকার Qwerty Keyboard


11
আপনি এসকিএল সার্ভারের মধ্যে এটি করতে চান কেন? আপনার উপস্থাপনা স্তরটি দক্ষতার সাথে পরিচালনা করা উচিত!
কিন শাহ

আপনার কাছে সর্বদা একটি উপস্থাপনা স্তর থাকে না, যেমন এসকিউএল সার্ভারে আমদানি করা খারাপ ডেটা পরিষ্কার করার সময় এবং আপনি এটি করার জন্য কোনও সি # প্রোগ্রাম লিখতে চান না। হ্যাঁ, আপনি একটি সিএলআর ফাংশনে বিনিয়োগ করতে পারেন, তবে কীভাবে দ্রুত এবং নোংরা কিছু কাজ করে।
জেফ্রি রাফগার্ডেন

উত্তর:


26
declare @a varchar(30); 

set @a = 'qWeRtY kEyBoArD TEST<>&''"X';

select stuff((
       select ' '+upper(left(T3.V, 1))+lower(stuff(T3.V, 1, 1, ''))
       from (select cast(replace((select @a as '*' for xml path('')), ' ', '<X/>') as xml).query('.')) as T1(X)
         cross apply T1.X.nodes('text()') as T2(X)
         cross apply (select T2.X.value('.', 'varchar(30)')) as T3(V)
       for xml path(''), type
       ).value('text()[1]', 'varchar(30)'), 1, 1, '') as [Capitalize first letter only];

এটি প্রথমে খালি ট্যাগ দিয়ে সমস্ত স্পেস প্রতিস্থাপন করে স্ট্রিংটিকে এক্সএমএলে রূপান্তর করে <X/>। তারপরে এটি প্রতি সারির একটি শব্দ ব্যবহার করে এক্সএমএলকে ছাড়ে nodes()। সারিগুলিকে একমূল্যে ফিরে পেতে এটি for xml pathকৌশলটি ব্যবহার করে ।


8
এবং সেই কোডটি হ'ল এসকিউএল-তে আমি কখনই তা করব না। উত্তরটি ভুল বলে না - এটির জন্য জিজ্ঞাসা করা হয়েছিল। তবে স্ট্যান্ডার্ড এসকিউএল এই ধরণের স্ট্রিং ম্যানিপুলেশনের জন্য হাস্যকরভাবে অসুস্থ। একটি সিএলআর ভিত্তিক ফাংশন কাজ করবে, বা কেবল উপস্থাপনা স্তরে এটি করবে।
টমটম

8
@ টমটম এটি জটিল দেখাচ্ছে তবে এটি উত্পন্ন ক্যোয়ারী পরিকল্পনার তুলনায় এটি কিছুই নয় এবং এটি কোনও মানদণ্ডের দ্বারা দ্রুত হবে না। ক্যোয়ারিতে আসলে কী চলছে এবং এটি কেন এভাবে লেখা হচ্ছে তা খনন করা যদিও শিক্ষামূলক এবং মজাদার । স্ট্রিং বিভক্ত ফাংশন (নম্বর টেবিল) দিয়ে সমস্যার সমাধান করা যেতে পারে। সংক্ষিপ্তকরণের for xml pathকৌশলটি এড়ানো কঠিন । আপনি যদি সিএলআর না যান তবে গতি এবং দক্ষতা যদি গুরুত্বপূর্ণ হয় তবে সেরা বিকল্প হবে।
মিকেল এরিকসন

15

এসকিউএল সার্ভার 2016 এ আপনি আর এর সাহায্যে এটি করতে পারেন

-- R capitalisation code stolen from here:
-- http://stackoverflow.com/questions/6364783/capitalize-the-first-letter-of-both-words-in-a-two-word-string

EXEC sp_execute_external_script
    @language = N'R',
    @script = N'
simpleCap <- function(x) {
  s <- strsplit(x, " ")[[1]]
  paste(toupper(substring(s, 1,1)), substring(s, 2),
        sep="", collapse=" ")
}             

OutputDataSet <- as.data.frame((sapply(as.vector(InputDataSet$xtext), simpleCap)))',
    @input_data_1 = N'SELECT LOWER(testString) xtext FROM dbo.testStrings'
WITH RESULT SETS ( ( properCase VARCHAR(50) NOT NULL ) );

আপনার হওয়া উচিত বা না অন্য প্রশ্ন:)


ওহ, আপনি অবশ্যই না। কখনও কখনও এটি সর্বনিম্ন খারাপ বিকল্প, বা ওপি যেমন উল্লেখ করেছে, তাদের দ্রুত এবং নোংরা দরকার।
জোনাথন ফাইট

12

হতে পারে আমি নির্বোধ হয়ে যাচ্ছি কিন্তু নীচে প্রদত্ত কিছু প্রশ্নের জন্য যা আমি সরবরাহিত কিছুগুলির বিরুদ্ধে লিখেছি তা পরীক্ষা করে দেখছি, এটি কিছুটা দক্ষ বলে মনে হচ্ছে (সূচকের উপর নির্ভর করে)।

কোডটি কিছুটা বোকা, তবে এমন কোনও কথা নেই যে এটি বোকা দেখাচ্ছে তবে এটি কাজ করে তবে এটি বোকা নয়।

Begin

    Declare @text Varchar(30);

    Set @text = 'qWeRtY kEyBoArD TEST<>&''"X';

    Declare @1 Varchar(2)= ' a'
      , @2 Varchar(2)= ' b'
      , @3 Varchar(2)= ' c'
      , @4 Varchar(2)= ' d'
      , @5 Varchar(2)= ' e'
      , @6 Varchar(2)= ' f'
      , @7 Varchar(2)= ' g'
      , @8 Varchar(2)= ' h'
      , @9 Varchar(2)= ' i'
      , @10 Varchar(2)= ' j'
      , @11 Varchar(2)= ' k'
      , @12 Varchar(2)= ' l'
      , @13 Varchar(2)= ' m'
      , @14 Varchar(2)= ' n'
      , @15 Varchar(2)= ' o'
      , @16 Varchar(2)= ' p'
      , @17 Varchar(2)= ' q'
      , @18 Varchar(2)= ' r'
      , @19 Varchar(2)= ' s'
      , @20 Varchar(2)= ' t'
      , @21 Varchar(2)= ' u'
      , @22 Varchar(2)= ' v'
      , @23 Varchar(2)= ' w'
      , @24 Varchar(2)= ' x'
      , @25 Varchar(2)= ' y'
      , @26 Varchar(2)= ' z';

Set @text=' '+@text

    Select  LTrim(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(Lower(@text) ,
                                                              @1 , Upper(@1)) ,
                                                              @2 , Upper(@2)) ,
                                                              @3 , Upper(@3)) ,
                                                              @4 , Upper(@4)) ,
                                                              @5 , Upper(@5)) ,
                                                              @6 , Upper(@6)) ,
                                                              @7 , Upper(@7)) ,
                                                              @8 , Upper(@8)) ,
                                                              @9 , Upper(@9)) ,
                                                              @10 , Upper(@10)) ,
                                                              @11 , Upper(@11)) ,
                                                              @12 , Upper(@12)) ,
                                                              @13 , Upper(@13)) ,
                                                              @14 , Upper(@14)) ,
                                                              @15 , Upper(@15)) ,
                                                              @16 , Upper(@16)) ,
                                                              @17 , Upper(@17)) ,
                                                              @18 , Upper(@18)) ,
                                                              @19 , Upper(@19)) ,
                                                              @20 , Upper(@20)) ,
                                                            @21 , Upper(@21)) ,
                                                    @22 , Upper(@22)) , @23 ,
                                            Upper(@23)) , @24 , Upper(@24)) ,
                            @25 , Upper(@25)) , @26 , Upper(@26)));


end

2
এটি একটি দুর্দান্ত এবং ভয়ঙ্কর উত্তর। আমি শুরুতে আপনি যে জায়গাটি পেরেছেন তা আমি বিশেষত পছন্দ করি এবং তারপরে শেষে সরে যাই।
ব্র্যাডিসি

2
@ ব্র্যাডসি এটি ঘৃণ্য, কিন্তু যখন আমি এটি ডেটা সেটের বিপরীতে এক্সএমএল পদ্ধতির তুলনায় চেষ্টা করেছি তখন মনে হয় এটি ব্যয়ের একটি অংশে চলেছে!
ক্রিস জে

9

আর একটি বিকল্প হ'ল এসকিউএলসিআরআর এর মাধ্যমে এটি পরিচালনা করা। .NET- এ ইতিমধ্যে উপলব্ধ একটি পদ্ধতি রয়েছে যা এটি করে: TextInfo.ToTitleCase (inSystem.Globalization )। এই পদ্ধতিটি উচ্চ শব্দের প্রতিটি শব্দের প্রথম অক্ষর, এবং বাকি অক্ষরগুলি লোয়ার-কেস করবে। এখানকার অন্যান্য প্রস্তাবগুলির মতো নয়, এটি এমন শব্দগুলিকে এড়িয়ে যায় যা সমস্ত উচ্চতর ক্ষেত্রে রয়েছে, এটি তাদের সংক্ষিপ্ত শব্দ হিসাবে ধরে নিয়েছে। অবশ্যই, যদি এই আচরণটি পছন্দসই হয় তবে এটি করার জন্য টি-এসকিউএল পরামর্শগুলির যে কোনও একটি আপডেট করা যথেষ্ট সহজ।

.NET পদ্ধতির একটি সুবিধা হ'ল এটি উচ্চ-অক্ষরগুলি পরিপূরক অক্ষর can উদাহরণস্বরূপ: ছোট ছোট লেটার ওউয়ের ডিজার ক্যাপিটাল লেটার OW এর একটি বড় আকারের ম্যাপিং রয়েছে (আমি এখানে এগুলি আটকানোর সময় উভয়ই বাক্স হিসাবে প্রদর্শিত হয়) , তবে UPPER()ফাংশনটি লোয়ার-কেস সংস্করণটি আপার-কেস-এ পরিবর্তিত করে না when বর্তমান ডেটাবেসগুলির জন্য ডিফল্ট কোলেশন সেট করা আছে Latin1_General_100_CI_AS_SC। এটি এমএসডিএন ডকুমেন্টেশনের সাথে সামঞ্জস্যপূর্ণ বলে মনে হচ্ছে যা কোনও কোলেশন: কোলেশন এবং ইউনিকোড সমর্থন: পরিপূরক চরিত্রগুলি ব্যবহার করার সময় আলাদাভাবে আচরণ করে এমন ফাংশনগুলির তালিকাতে তালিকাভুক্ত নয় UPPERএবং তালিকাভুক্ত নয় ।LOWER_SC

SELECT N'DESERET SMALL LETTER OW' AS [Label], NCHAR(0xD801)+NCHAR(0xDC35) AS [Thing]
UNION ALL
SELECT N'DESERET CAPITAL LETTER OW' AS [Label], NCHAR(0xD801)+NCHAR(0xDC0D) AS [Thing]
UNION ALL
SELECT N'SmallButShouldBeCapital' AS [Label], UPPER(NCHAR(0xD801)+NCHAR(0xDC35)) AS [Thing]

রিটার্ন (বড় করা যাতে আপনি আসলে পরিপূরক চরিত্রটি দেখতে পারেন):

UPPER () পরিপূরক চরিত্রের সাথে কাজ করছে না এমন প্রশ্নের ফলাফল দেখাচ্ছে

আপনি অক্ষরগুলির পূর্ণ (এবং বর্তমান) তালিকা দেখতে পারেন যা নিম্ন-কেস হয় এবং ইউনিকোড.অর্গ.এতে নিম্নলিখিত অনুসন্ধান বৈশিষ্ট্যটি ব্যবহার করে বড় হাতের অক্ষরে পরিবর্তিত হয় ("ডিজাইন" না পাওয়া পর্যন্ত আপনি স্ক্রল করে পরিপূরক চরিত্রগুলি দেখতে পারেন) বিভাগে, বা কেবল হিট করুন Control-Fএবং সেই শব্দটি অনুসন্ধান করুন):

http://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5B%3AChanges_When_Titlecased%3DYes%3A%5D

যদিও সত্যই বলা যায়, এটি কোনও বিশাল সুবিধা নয় যেহেতু সন্দেহ নেই যে যে কেউ আসলে পরিপূরক চরিত্রগুলির যে কোনওটি শিরোনাম-মামলাযুক্ত হতে পারে ব্যবহার করছে। যেভাবেই হোক, এখানে এসকিউএলসিআরআর কোড রয়েছে:

using System.Data.SqlTypes;
using System.Globalization;
using Microsoft.SqlServer.Server;

public class TitleCasing
{
    [return: SqlFacet(MaxSize = 4000)]
    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true)]
    public static SqlString TitleCase([SqlFacet(MaxSize = 4000)] SqlString InputString)
    {
        TextInfo _TxtInf = new CultureInfo(InputString.LCID).TextInfo;
        return new SqlString (_TxtInf.ToTitleCase(InputString.Value));
    }
}

এখানে @ মিকায়েল এরিকসনের পরামর্শটি রয়েছে - NVARCHARডেটা হ্যান্ডেল করতে কিছুটা সংশোধন করার পাশাপাশি সমস্ত আপার-কেস শব্দগুলি (.NET পদ্ধতির আচরণের সাথে আরও ঘনিষ্ঠভাবে মেলাতে) শব্দগুলি এড়িয়ে যাওয়া - সেই টি-এসকিউএল বাস্তবায়নের পরীক্ষার পাশাপাশি এসকিউএলসিআরআর বাস্তবায়ন:

SET NOCOUNT ON;
DECLARE @a NVARCHAR(50);

SET @a = N'qWeRtY kEyBoArD TEST<>&''"X one&TWO '
         + NCHAR(0xD801)+NCHAR(0xDC28)
         + N'pPLe '
         + NCHAR(0x24D0) -- ⓐ  Circled "a"
         + NCHAR(0xFF24) -- D  Full-width "D"
         + N'D u'
         + NCHAR(0x0308) -- ̈  (combining diaeresis / umlaut)
         + N'vU'
         + NCHAR(0x0308) -- ̈  (combining diaeresis / umlaut)
         + N'lA';
SELECT @a AS [Original];

SELECT STUFF((
       SELECT N' '
              + IIF(UPPER(T3.V) <> T3.V COLLATE Latin1_General_100_BIN2, 
                    UPPER(LEFT(T3.V COLLATE Latin1_General_100_CI_AS_SC, 1))
                    + LOWER(STUFF(T3.V COLLATE Latin1_General_100_CI_AS_SC, 1, 1, N'')),
                    T3.V)
       FROM (SELECT CAST(REPLACE((SELECT @a AS N'*' FOR XML PATH('')), N' ', N'<X/>')
                    AS XML).query('.')) AS T1(X)
       CROSS APPLY T1.X.nodes('text()') AS T2(X)
       CROSS APPLY (SELECT T2.X.value('.', 'NVARCHAR(70)')) AS T3(V)
       FOR XML PATH(''), TYPE
       ).value('text()[1]', 'NVARCHAR(70)') COLLATE Latin1_General_100_CI_AS_SC, 1, 1, N'')
                AS [Capitalize first letter only];

SELECT dbo.TitleCase(@a) AS [ToTitleCase];

এসকিউএলসিআরআর এর মাধ্যমে টি-এসকিউএল এক্সএমএল কোড এবং টাইটিটলকেসের আউটপুট দেখাচ্ছে কোয়েরির ফলাফল

আচরণের আরেকটি পার্থক্য হ'ল এই বিশেষ টি-এসকিউএল বাস্তবায়ন কেবল ফাঁকা জায়গায় বিভক্ত হয়, যেখানে ToTitleCase()পদ্ধতিটি বেশিরভাগ অ-অক্ষরকে শব্দের বিভাজক হিসাবে বিবেচনা করে (অতএব "এক & TWO" অংশটি পরিচালনা করার ক্ষেত্রে পার্থক্য)।

উভয় বাস্তবায়ন সঠিকভাবে সংক্রমগুলি পরিচালনা করে। ""VÜlA" এর প্রতিটি বর্ণিত অক্ষর একটি বেস চিঠি এবং একটি সংমিশ্রণ ডায়ারেসিস / উমলৌত (প্রতিটি বর্ণের উপরে দুটি বিন্দু) নিয়ে গঠিত এবং উভয় পরীক্ষায় সেগুলি সঠিকভাবে অন্য ক্ষেত্রে রূপান্তরিত হয়।

পরিশেষে, এসকিউএলসিআরআর সংস্করণটির একটি অপ্রত্যাশিত অসুবিধা হ'ল বিভিন্ন পরীক্ষা করে সামনে এসে, আমি বিজ্ঞপ্তিযুক্ত পত্রগুলি পরিচালনা করার সাথে সম্পর্কিত নেট নেট কোডটিতে একটি বাগ খুঁজে পেয়েছি (যা এখন মাইক্রোসফ্ট সংযোগে রিপোর্ট করা হয়েছে - আপডেট: সংযোগ হয়েছে /dev/nullআক্ষরিক - এ সরানো হয়েছে - সুতরাং সমস্যাটি এখনও বিদ্যমান থাকলে আমার এটি পুনরায় জমা দেওয়ার প্রয়োজন হতে পারে)। .NET গ্রন্থাগারটি বৃত্তযুক্ত অক্ষরগুলিকে শব্দের বিভাজক হিসাবে বিবেচনা করে, এ কারণেই এটি "ⓐDD "টিকে" Ⓐdd "হিসাবে রূপান্তরিত করে না।


অবগতির জন্য

TextInfo.ToTitleCaseউপরে উল্লিখিত পদ্ধতিটি এনপ্যাপুলেট করে একটি প্রাক-সম্পন্ন এসকিউএলসিআরআর ফাংশন এখন এসকিউএল # এর মুক্ত সংস্করণে (যা আমি লিখেছি) স্ট্রিং_টাইটিটেলকেস এবং স্ট্রিং_টাইটেল ক্যাসেস 4 কে হিসাবে উপলভ্য

😺


5

মিকারেল এরিকসনের উত্তরের বিকল্প হিসাবে , আপনি বহু-সারি নির্বাচনী বিবৃতিগুলিতে ভেরিয়েবল সেটিংয়ের স্বত্বাধিকারী টি-এসকিউএল হ্যান্ডলিংটি ব্যবহার করতে পারেন।

এসকিউএল সার্ভারে, যখন কোনও ভেরিয়েবল একটি নির্বাচন বাছাইয়ের অংশ হিসাবে সেট করা হয়, প্রতিটি সারি সেট যুক্তির একটি পুনরাবৃত্তি সম্পাদন করে।

লোকেরা প্রায়শই এই পদ্ধতিটি স্ট্রিংগুলি সংঘবদ্ধ করার জন্য ব্যবহার করে, যদিও এটি অসমর্থিত এবং এর সাথে কিছু সরকারীভাবে নথিভুক্ত সমস্যা রয়েছে । সরকারী সমস্যাটি নির্দিষ্ট অর্ডার দ্বারা বৈশিষ্ট্যগুলির সাথে সম্পর্কিত, এবং আমাদের এখানে এটির দরকার নেই, সম্ভবত এটি কোনও নিরাপদ বিকল্প।

এখানে, আমরা বর্ণমালার 26 টি অক্ষরের উপরে পুনরাবৃত্তি করি এবং কোনও স্থানের আগে যদি তাদের পূর্বে থাকে তবে তাদের একটি বড় আকারের সংস্করণ দিয়ে প্রতিস্থাপন করি। (আমরা প্রথম অক্ষরকে মূলধনীকরণের মাধ্যমে প্রাথমিকভাবে স্ট্রিং প্রস্তুত করি এবং বাকী লোকেস কেস তৈরি করে, যেমনটি আপনি আপনার প্রশ্নে করেছিলেন))

এসকিউএল কিছুটা জটিল কারণ এটির পরিবর্তনের 26 টি পুনরাবৃত্তি উত্পন্ন করার জন্য এটি টেলি টেবিল - একটি সংখ্যার সারণী - ব্যবহারের প্রয়োজন। সেই সংখ্যার টেবিলটি তৈরি করতে আপনি একটি সহজ ইনলাইন টেবিল-মূল্যবান ব্যবহারকারী সংজ্ঞায়িত ফাংশন (টিভিএফ) তৈরি করতে পারেন বা আপনি কোনও দৈহিক টেবিলও ব্যবহার করতে পারেন।

এই বিকল্পের একটি অপূর্ণতা হ'ল এটি কোনও ইনলাইন টিভিএফের অংশ হতে পারে না কারণ এটিতে একটি ভেরিয়েবল নির্ধারণের প্রয়োজন। সুতরাং আপনি যদি নিজের আউটপুটটির কলামে এই পদ্ধতিটি প্রয়োগ করতে চান তবে আপনাকে এটি একটি মাল্টি-স্টেটমেন্ট টিভিএফ বা স্কেলারের ব্যবহারকারীর সংজ্ঞায়িত ফাংশনে আবদ্ধ করতে হবে।

তবে এর ক্যোয়ারী পরিকল্পনাটি অনেক সহজ এবং এটি সম্ভবত এক্সএমএল পদ্ধতির চেয়ে উল্লেখযোগ্যভাবে দ্রুত faster আপনি তর্ক করতে পারেন এটি বোঝাও সহজ, (বিশেষত যদি আপনার নিজের ট্যালি টেবিল থাকে)।

DECLARE
    @a VARCHAR(15) = 'qWeRtY kEyBoArD';

SELECT
    @a = UPPER(LEFT(@a,1)) + LOWER(SUBSTRING(@a,2,LEN(@a)));

WITH TallyTableBase AS
(
    SELECT
        0 AS n
    FROM    (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) AS t(n)
)
SELECT
    @a = REPLACE(@a, ' ' + CHAR(n.n), ' ' + CHAR(n.n))
FROM        (
                SELECT      TOP 26 ROW_NUMBER() OVER (ORDER BY (SELECT 1)) + 64 AS n
                FROM        TallyTableBase a
                CROSS JOIN  TallyTableBase b
            ) AS n;

SELECT
    @a AS [NewValue];

(আমি এটি আরও বৃহত্তর স্ট্রিং ব্যবহার করে পরীক্ষা করেছি এবং এটি এক্সএমএল সমাধানের জন্য প্রায় 6 মিমি বনাম 14 মিমি।)

এই সমাধানের সাথে বেশ কয়েকটি অতিরিক্ত সীমাবদ্ধতা রয়েছে। যেমনটি লেখা হয়েছে, এটি একটি কেস সংবেদনশীল কোলেশন ধরে নিয়েছে, যদিও আপনি কোনও কার্য সম্পাদনের ব্যয়ে কোনও কোলেশন নির্দিষ্ট করে বা অনুসন্ধানের শব্দে এলসিএএসই চালিয়ে এই সমস্যাটি দূর করতে পারেন । এটি কেবলমাত্র স্ট্যান্ডার্ড ASCII অক্ষরগুলিতে সম্বোধন করে এবং চরিত্রের সেটে তাদের স্থান নির্ধারণের উপর নির্ভর করে , সুতরাং এটি with এর সাথে কিছুই করবে না ñ


3

ধরে নেওয়া যাক আপনি কেবল কোনও স্থান অনুসরণ করে শব্দকে বড় করে দেখছেন, এখানে এটি অন্য উপায় যা আপনি এটি করতে পারেন।

DECLARE @String VARCHAR(1000)
SET @String = 'qWeRtY kEyBoArD tEst'

/*
Set the string to all lower case and
add a space at the beginning to ensure
the first letter gets capitalized
in the CTE
*/
SET @String = LOWER(' ' + @String)  

/*
Use a Tally "Table" as a means of
replacing the letter after the space
with the capitalize version of the
letter
*/
;WITH TallyTable
AS
(
    SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as N
    FROM master.sys.all_columns a CROSS JOIN master.sys.all_columns b

)
SELECT @String = REPLACE(@String,SUBSTRING(@String,CHARINDEX(' ',@String,N), 2),UPPER(SUBSTRING(@String,CHARINDEX(' ',@String,N), 2)))
FROM TallyTable
WHERE CHARINDEX(' ',@String,N) <> 0

--Remove the space added to the beginning of the string earlier
SET @String = RIGHT(@String,LEN(@String) - 1)

1

বুলেট-প্রুফ নাও হতে পারে তবে আমি আশা করি এটি এই থ্রেডে সহায়ক অবদান।

DECLARE @t VARCHAR(50) = 'the quick brown fox jumps over the lazy dog', @i INT = 0

DECLARE @chk VARCHAR(1)

WHILE @i <= LEN(@t)
BEGIN
    SELECT @chk=SUBSTRING(@t,@i,1)
        IF @chk = CHAR(32)
        BEGIN
            SET @t = STUFF(@t,@i+1,1,UPPER(SUBSTRING(@t,@i+1,1)))
        END
    SET @i=@i+1
END
PRINT @t

0

এটি করার জন্য ফায়ারবার্ড ডাটাবেসে আমি যে পদ্ধতিটি ব্যবহার করেছি তার নীচে। সম্ভবত অনেকটা পরিষ্কার করা যেতে পারে তবে এটি আমার জন্য কাজটি পেয়েছে।

set term ~;

Create Procedure EachWordCap

As

Declare Variable lcaption varchar(33);
Declare Variable lcurrentpos integer;
Declare Variable lstringlen integer;
begin
    for select ' ' || trim(lower(imagedata.imagename)) from imagedata
    where imagedata.imagename is not null and imagedata.imagename != ''
    into :lcaption
    do 
    begin
        lcurrentpos = 0;
        lstringlen = char_length(lcaption);
        while (lcurrentpos != 1) do
        begin
            lcurrentpos = position(' ', lcaption, iif(lcurrentpos = 0, 1,lcurrentpos)) + 1 ;
            lcaption = left(lcaption,lcurrentpos - 1) || upper(substring(lcaption from lcurrentpos for 1)) || right(lcaption,lstringlen - lcurrentpos);
        end
        --Put what you want to do with the text in here
    end
end~
set term ;~

0

এই ধরণের জিনিসটির জন্য রিকার্সিভ সিটিইগুলি বেশ ভাল।

সম্ভবত বড় অপারেশনগুলির জন্য বিশেষভাবে দক্ষ নয়, তবে খাঁটি এসকিউএল নির্বাচন বিবৃতিতে এই ধরণের অপারেশনের অনুমতি দেয়:

declare @a varchar(100) 

set @a = 'tHe qUiCk bRoWn FOX jumps   OvEr The lAZy dOG';

WITH [CTE] AS (
  SELECT CAST(upper(Left(@a,1)) + lower(substring(@a,2,len(@a))) AS VARCHAR(100)) AS TEXT,
         CHARINDEX(' ',@a) AS NEXT_SPACE
  UNION ALL
  SELECT CAST(Left(TEXT,NEXT_SPACE) + upper(SubString(TEXT,NEXT_SPACE+1,1)) + SubString(TEXT,NEXT_SPACE+2,1000) AS VARCHAR(100)),
         CHARINDEX(' ',TEXT, NEXT_SPACE+1)
  FROM [CTE]
  WHERE NEXT_SPACE <> 0
)

SELECT TEXT
FROM [CTE]
WHERE NEXT_SPACE = 0

আউটপুট:

The Quick Brown Fox Jumps   Over The Lazy Dog

0

আমি এই সংস্করণটি পছন্দ করি। এটি সহজ, এবং একটি ফাংশন তৈরি করতে ব্যবহার করা যেতে পারে, আপনার কেবল এসকিউএল সার্ভারের সঠিক সংস্করণ থাকতে হবে:

WITH words
AS (
    SELECT upper(left(Value, 1)) + lower(substring(Value, 2, len(Value))) AS word
    FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ')
    )
SELECT STRING_AGG(words.word, ' ')
FROM words

কোনটি সঠিক সংস্করণ?
dezso

এসকিউএল সার্ভার (২০১ with দিয়ে শুরু)
ক্রিসটি

-2
DECLARE @someString NVARCHAR(MAX) = 'In this WHILE LOOP example' 

DECLARE @result NVARCHAR(MAX) =Upper(SUBSTRING(@someString, 1, 1))

DECLARE @index INT =2 

WHILE LEN(@someString)>@index

BEGIN

SET @result= @result+CASE WHEN CHARINDEX(' ',@someString,@index)<>0 THEN LOWER(SUBSTRING(@someString, @index, CHARINDEX(' ',@someString,@index)-@index+1)) +Upper(SUBSTRING(@someString, CHARINDEX(' ',@someString,@index)+1, 1)) ELSE  LOWER(SUBSTRING(@someString,@index, LEN(@someString) )) END

SET @index=CASE WHEN CHARINDEX(' ',@someString,@index)<>0 THEN CHARINDEX(' ',@someString,@index)+2 ELSE  LEN(@someString)+1  END

 END

SELECT  @result 

আমি আশা করি ...


ডাটাবেস প্রশাসকদের স্বাগতম! আপনার প্রশ্নটি কীভাবে লেখকের সমস্যার সমাধান করে তা ব্যাখ্যা করুন; ব্যাখ্যা ব্যতীত উত্তরগুলি সাধারণত ভাল হয় না।
গ্লোরফাইন্ডেল

-3

পরীক্ষার ডেটা

declare @word varchar(100)
with good as (select 'good' as a union select 'nice' union select 'fine')
select @word = (SELECT TOP 1 a FROM good ORDER BY NEWID())

বাস্তবায়ন

select substring(Upper(@word),1,1) + substring(@word, 2, LEN(@word))

ইতিমধ্যে পৃথক পৃথক পৃথক শব্দগুলি মূলধন করা সহজ। আমি বিশ্বাস করি যে ওপি কীভাবে একটি স্ট্রিংয়ের মধ্যে শব্দ সনাক্ত করতে এবং সেগুলির প্রতিটিকে মূলধন করতে আগ্রহী।
সমস্ত ব্যবসায়ের জন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.