টি-এসকিউএল এর একক স্পেসের সাথে সদৃশ স্পেসগুলি প্রতিস্থাপন করুন


103

আমাকে নিশ্চিত করতে হবে যে প্রদত্ত ক্ষেত্রটিতে অক্ষরের মধ্যে একাধিক স্থান (আমি সমস্ত সাদা স্থানের জন্য উদ্বিগ্ন নই, কেবল স্থান) নেই।

তাই

'single    spaces   only'

মধ্যে পরিণত করা প্রয়োজন

'single spaces only'

নীচে কাজ করবে না

select replace('single    spaces   only','  ',' ')

এটি ফলাফল হিসাবে

'single  spaces  only'

আমি সত্যিই সিএলআর ভিত্তিক সমাধানের পরিবর্তে দেশীয় টি-এসকিউএল সাথে থাকতে পছন্দ করি।

ভাবনা?


আপনি এটি আরজিইএক্স প্রতিস্থাপনের মাধ্যমে করতে পারেন
রাজ মোর

উত্তর:


334

এমনকি পরিপাটি:

select string = replace(replace(replace(' select   single       spaces',' ','<>'),'><',''),'<>',' ')

আউটপুট:

একক স্পেস নির্বাচন করুন


6
আপনি যদি স্ট্রিংয়ের সামনের এবং শেষের জায়গাগুলি সরাতে চান, তবে একটি প্রতিস্থাপনটি একটি এলটিআরআইএম, আরটিআরআইমে মুড়ে দিন এবং এটি এটি আপনার জন্য করবে।
নীল নাইট

7
যতক্ষণ না আপনার স্ট্রিংয়ে প্রচুর <বা> চিহ্ন থাকে না। আমার পছন্দ মত ভঙ্গুর মনে হচ্ছে।
জনএফএক্স

9
সত্যই মার্জিত হ্যাক। উত্সাহিত। <> সম্ভাব্যভাবে ইনপুট পাঠ্যে থাকলে কোনও দুটি অক্ষর মাঝের অংশের জন্য ব্যবহার করা যেতে পারে।
রিচার্ডাল্টলেন্ট

33
ক্রিস, আপনি ছাপ (17) এবং CHAR (18) এর মতো মুদ্রণযোগ্য ASCII অক্ষর ব্যবহার করতে পারেন, কারণ এগুলি আপনার ইনপুট পাঠ্যে কখনই থাকবে না। স্বীকৃত উত্তরের লুপিংয়ের চেয়ে আরও দ্রুত।
রিচার্ডাল্টলেন্ট

7
আপনি '> <', '' কোনও স্থান প্রতিস্থাপন করেন নি তবে এখন আমি এটি পেয়েছি ... এটি খুব উজ্জ্বল। আমি প্রিন্টযোগ্য ASCII অক্ষরগুলির সাথে যুক্ত হওয়া সংমিশ্রণগুলি ব্যবহার করার জন্য @richardtallent পরামর্শটি খুব পছন্দ করেছি: REPLACE (REPLACE (REPLACE (শেষ নাম, '', 'CHAR (17) CHAR (18)'), 'CHAR (18) ) CHAR (17) ',' '),' CHAR (17) CHAR (18) ',' ')
অ্যান্টনি গ্রিগস

25

এটি কাজ করবে:

declare @test varchar(100)
set @test = 'this   is  a    test'

while charindex('  ',@test  ) > 0
begin
   set @test = replace(@test, '  ', ' ')
end

select @test

4
ফাংশনে মোড়ানো এবং বর্ণচর্চা (100) কে নভারচর (সর্বাধিক) পরিবর্তন করা
ক্রিস্টোফ

জেমসের এবং নীলের লিপিগুলির মধ্যে পার্থক্যটি হ'ল জেমস লুপ করার সময় চালিত হয় যদিও এটি ব্যক্তিগত অভিজ্ঞতা অনুসারে এটি চালিত হয় যদিও একটি টেবিলের 50,000 রেকর্ড খুব ধীর গতিতে থাকে, সুতরাং আপনাকে এটি প্রক্রিয়া হিসাবে তৈরি করতে হবে এবং একটি রেকর্ডে পাস করতে হবে এবং কিছু আপনার কাছে এমন কোনও কাজের ব্যান্ড নতুন পদ্ধতি তৈরি করার অনুমতি নাও থাকতে পারে। নিল এর ব্যবহারসমূহ প্রতি বিদ্যমান ফাংশন কারণ এটি ব্যবহার করে <>, যদি আপনি চান একটি স্ট্রিং আছে "release < now"তারপর আপনি পাবেন "release<><><<><>now", "release<<>now", "release< now", তার চিহ্ন কোনো জুড়ি সঙ্গে একই, আপনি যদি যুগল একটি একক এক আছে তারপর, এটা সরানো যাচ্ছে
স্মৃতি-এক্স

4
এটি 50k রেকর্ডের মাধ্যমে চালানো দ্রুত হালকা হওয়া উচিত, যদি এটি আপনার সমস্যা হয় তবে আমি অন্যান্য সমস্যাগুলি খতিয়ে দেখি।
ব্যবহারকারী 3486773

17

আপনি যদি জানেন যে এক সারিতে নির্দিষ্ট সংখ্যক স্পেসের চেয়ে বেশি কিছু থাকবে না, আপনি কেবল প্রতিস্থাপন করতে বাসা পেতে পারেন:

replace(replace(replace(replace(myText,'  ',' '),'  ',' '),'  ',' '),'  ',' ')

4 টি প্রতিস্থাপনে টানা 16 টি স্থান অবধি ঠিক করা উচিত (16, তারপরে 8, তারপরে 4, তারপরে 2, তারপরে 1)

যদি এটি উল্লেখযোগ্যভাবে দীর্ঘ হতে পারে, তবে আপনাকে ইন-লাইন ফাংশনের মতো কিছু করতে হবে:

CREATE FUNCTION strip_spaces(@str varchar(8000))
RETURNS varchar(8000) AS
BEGIN 
    WHILE CHARINDEX('  ', @str) > 0 
        SET @str = REPLACE(@str, '  ', ' ')

    RETURN @str
END

তারপরে শুধু করুন

SELECT dbo.strip_spaces(myText) FROM myTable

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

6
update mytable
set myfield = replace (myfield, '  ',  ' ')
where charindex('  ', myfield) > 0 

প্রতিস্থাপন সমস্ত ডাবল স্পেসে কাজ করবে, একাধিক প্রতিস্থাপনের দরকার নেই। এটি সেট-ভিত্তিক সমাধান।


এই 4 টি ফাঁকা জায়গাটি 2 এ পরিণত হবে না?
ক্রিস্টফ 16

আমি আমার প্রশ্নের মধ্যে এই সমাধানটিকে প্রয়োজনীয়তা পূরণ না করে বলে আছি, তবে ধন্যবাদ।
ক্রিস্টোফ

6

এটি ফাংশনের মাধ্যমে পুনরাবৃত্তভাবে করা যেতে পারে:

CREATE FUNCTION dbo.RemSpaceFromStr(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX) AS
BEGIN
  RETURN (CASE WHEN CHARINDEX('  ', @str) > 0 THEN
    dbo.RemSpaceFromStr(REPLACE(@str, '  ', ' ')) ELSE @str END);
END

তারপরে, উদাহরণস্বরূপ:

SELECT dbo.RemSpaceFromStr('some   string    with         many     spaces') AS NewStr

ফেরত:

NewStr
some string with many spaces

বা @ agdk26 বা @ নীল নাইট দ্বারা বর্ণিত পদ্ধতির ভিত্তিতে সমাধান (তবে নিরাপদ)
উভয় উদাহরণই উপরে আউটপুট ফেরত:

SELECT REPLACE(REPLACE(REPLACE('some   string    with         many     spaces'
  , '  ', ' ' + CHAR(7)), CHAR(7) + ' ', ''), ' ' + CHAR(7), ' ') AS NewStr 
--but it remove CHAR(7) (Bell) from string if exists...

বা

SELECT REPLACE(REPLACE(REPLACE('some   string    with         many     spaces'
  , '  ', ' ' + CHAR(7) + CHAR(7)), CHAR(7) + CHAR(7) + ' ', ''), ' ' + CHAR(7) + CHAR(7), ' ') AS NewStr
--but it remove CHAR(7) + CHAR(7) from string

কিভাবে এটা কাজ করে: এখানে চিত্র বর্ণনা লিখুন

সতর্কতা:
ফাঁকা স্থান প্রতিস্থাপন করতে ব্যবহৃত চর / স্ট্রিংয়ের শুরু বা শেষের স্ট্রিংয়ের অস্তিত্ব থাকা উচিত এবং একা দাঁড়িয়ে থাকা উচিত।


4
আমি এর জন্য একটি পুনরাবৃত্ত ফাংশনের ধারণাটি পছন্দ করি। সচেতন হওয়ার মতো কিছু আছে?
জাচ স্মিথ

5

এটি কিছুটা নিষ্ঠুর শক্তি, তবে কাজ করবে

CREATE FUNCTION stripDoubleSpaces(@prmSource varchar(max)) Returns varchar(max)
AS 
BEGIN
    WHILE (PATINDEX('%  %', @prmSource)>0)
     BEGIN
        SET @prmSource = replace(@prmSource  ,'  ',' ')
     END

    RETURN @prmSource
END

GO

-- Unit test -- 
PRINT dbo.stripDoubleSpaces('single    spaces   only')

single spaces only

3

এখানে আগে বা পরে যে কোনও স্পেস এবং স্ট্রিংয়ের মধ্যে একাধিক স্পেস পরিষ্কার করার জন্য আমি তৈরি করেছি একটি সাধারণ ফাংশন। এটি একা প্রসারিতভাবে প্রায় 108 টি স্পেস এবং স্ট্রিংয়ের মতো যতগুলি ব্লক পরিচালনা করে। আপনার যদি প্রয়োজন হয় তবে বৃহত্তর খণ্ডগুলিতে অতিরিক্ত লাইন যুক্ত করে আপনি 8 টি কারণের সাহায্যে এটি বাড়িয়ে তুলতে পারেন। এটি দ্রুত সঞ্চালিত হয়েছে বলে মনে হচ্ছে এবং এটি কোনও বৃহত প্রয়োগে সাধারণ ব্যবহার হওয়া সত্ত্বেও কোনও সমস্যা তৈরি করে না।

CREATE FUNCTION [dbo].[fnReplaceMultipleSpaces] (@StrVal AS VARCHAR(4000)) 
RETURNS VARCHAR(4000) 
AS 
BEGIN

    SET @StrVal = Ltrim(@StrVal)
    SET @StrVal = Rtrim(@StrVal)

    SET @StrVal = REPLACE(@StrVal, '                ', ' ')  -- 16 spaces
    SET @StrVal = REPLACE(@StrVal, '        ', ' ')  -- 8 spaces
    SET @StrVal = REPLACE(@StrVal, '    ', ' ')  -- 4 spaces
    SET @StrVal = REPLACE(@StrVal, '  ', ' ')  -- 2 spaces
    SET @StrVal = REPLACE(@StrVal, '  ', ' ')  -- 2 spaces (for odd leftovers)

RETURN @StrVal

END

1

উত্তরের খোঁজ করার সময় এটি পাওয়া গেছে:

SELECT REPLACE(
        REPLACE(
             REPLACE(
                LTRIM(RTRIM('1 2  3   4    5     6'))
            ,'  ',' '+CHAR(7))
        ,CHAR(7)+' ','')
    ,CHAR(7),'') AS CleanString
where charindex('  ', '1 2  3   4    5     6') > 0

পুরো উত্তরটি (ব্যাখ্যা সহ) এখান থেকে টানা হয়েছিল: http://techtipsbysatish.blogspot.com/2010/08/sql-server-replace-m Multipleple-spaces- with.html

দ্বিতীয় বর্ণনায়, মনে হয় নির্বাচিত উত্তরের কিছুটা আলাদা সংস্করণ।


1

পদ্ধতি # 1

প্রথম পদ্ধতিটি হ'ল অস্থায়ী চিহ্নিতকারী হিসাবে অস্বাভাবিক প্রতীক সংমিশ্রণের সাথে শব্দের মধ্যে অতিরিক্ত স্পেস প্রতিস্থাপন করা। তারপরে আপনি একটি লুপের পরিবর্তে প্রতিস্থাপন ফাংশনটি ব্যবহার করে অস্থায়ী চিহ্নিতকারী প্রতীকগুলি প্রতিস্থাপন করতে পারেন।

এখানে একটি কোড উদাহরণ রয়েছে যা স্ট্রিং ভেরিয়েবলের মধ্যে পাঠ্যকে প্রতিস্থাপন করে।

DECLARE @testString AS VARCHAR(256) = ' Test        text   with  random*        spacing. Please normalize  this spacing!';
SELECT REPLACE(REPLACE(REPLACE(@testString, ' ', '*^'), '^*', ''), '*^', ' ');

এক্সিকিউশন সময় পরীক্ষা # 1: এই প্রতিস্থাপন পদ্ধতির দশ রানের মধ্যে, সার্ভারের জবাবগুলির গড় অপেক্ষার সময়কাল ছিল 1.7 মিলিসেকেন্ড এবং মোট মৃত্যুর সময় ছিল 4.6 মিলিসেকেন্ড। এক্সিকিউশন সময় পরীক্ষা # 2: সার্ভারের জবাবগুলিতে গড় অপেক্ষার সময়কাল ছিল 1.7 মিলিসেকেন্ড এবং মোট কার্যনির্বাহার সময় ছিল 3.7 মিলিসেকেন্ড।

পদ্ধতি # 2

দ্বিতীয় পদ্ধতিটি প্রথমটির মতো যথেষ্ট মার্জিত নয়, তবে কাজটিও পায়। এই পদ্ধতিটি চারটি বাসা বেঁধে কাজ করে (বা বিকল্পভাবে আরও) এমন স্টেটমেন্টগুলি প্রতিস্থাপন করে যা দুটি ফাঁকা স্থানকে একটি ফাঁকা জায়গায় প্রতিস্থাপন করে।

DECLARE @testString AS VARCHAR(256) = ' Test        text   with  random*        spacing. Please normalize  this spacing!';
SELECT REPLACE(REPLACE(REPLACE(REPLACE(@testString,' ',' '),' ',' '),' ',' '),' ',' ')

এক্সিকিউশন সময় পরীক্ষা # 1: এই প্রতিস্থাপন পদ্ধতির দশ রানের মধ্যে, সার্ভারের জবাবগুলিতে গড় অপেক্ষার সময়কাল ছিল 1.9 মিলিসেকেন্ড এবং মোট মৃত্যুর সময়টি ছিল 3.8 মিলিসেকেন্ড। এক্সিকিউশন সময় পরীক্ষা # 2: সার্ভারের জবাবগুলিতে গড় অপেক্ষার সময়কাল ছিল 1.8 মিলিসেকেন্ড এবং মোট কার্যনির্বাহার সময় ছিল 4.8 মিলিসেকেন্ড।

পদ্ধতি # 3

শব্দের মধ্যে অতিরিক্ত স্পেস প্রতিস্থাপনের তৃতীয় পদ্ধতিটি হল একটি সাধারণ লুপ ব্যবহার করা। আপনি কিছুক্ষণ লুপের জন্য অতিরিক্ত জায়গাগুলিতে একটি চেক করতে পারেন এবং তারপরে লুপের প্রতিটি পুনরাবৃত্তির সাথে অতিরিক্ত স্থানগুলি হ্রাস করতে প্রতিস্থাপন ফাংশনটি ব্যবহার করতে পারেন।

DECLARE @testString AS VARCHAR(256) = ' Test text with random* spacing. Please normalize this spacing!';
WHILE CHARINDEX(' ',@testString) > 0
SET @testString = REPLACE(@testString, ' ', ' ')
SELECT @testString

এক্সিকিউশন সময় পরীক্ষা # 1: এই প্রতিস্থাপন পদ্ধতির দশ রানের মধ্যে, সার্ভারের জবাবের গড় অপেক্ষার সময়কাল ছিল 1.8 মিলিসেকেন্ড এবং মোট কার্যকর সময় ছিল 3.4 মিলিসেকেন্ড। এক্সিকিউশন সময় পরীক্ষা # 2: সার্ভারের জবাবগুলিতে গড় অপেক্ষার সময়কাল ছিল 1.9 মিলিসেকেন্ড এবং মোট কার্যনির্বাহার সময় ছিল 2.8 মিলিসেকেন্ড।


1

এটি একাধিক প্রতিস্থাপনের মাধ্যমে সমাধান যা কোনও স্ট্রিংয়ের জন্য কাজ করে (কোনও বিশেষ অক্ষরের প্রয়োজন হয় না, যা স্ট্রিংয়ের অংশ নয়)।

declare @value varchar(max)
declare @result varchar(max)
set @value = 'alpha   beta gamma  delta       xyz'

set @result = replace(replace(replace(replace(replace(replace(replace(
  @value,'a','ac'),'x','ab'),'  ',' x'),'x ',''),'x',''),'ab','x'),'ac','a')

select @result -- 'alpha beta gamma delta xyz'

সুন্দর জিনিস, তবে 'আবে' কে 'কুড়াল' এ পরিবর্তন করা হচ্ছে
অ্যাডাম সাইলেনকো

0

একাধিক স্পেস একক স্পেসে প্রতিস্থাপন করতে আমি এক্সএমএল পথ সমাধানের জন্য ব্যবহার করি

এক্সএমএল ট্যাগগুলির সাথে স্পেসগুলি প্রতিস্থাপন করার ধারণাটি হ'ল এক্সএমএল ট্যাগ ছাড়াই এক্সএমএল স্ট্রিংটিকে স্ট্রিং টুকরাতে বিভক্ত করুন অবশেষে দুটির মধ্যে একক স্পেস অক্ষর যুক্ত করে স্ট্রিংয়ের মানগুলি সংক্ষেপণ করুন

এখানে চূড়ান্ত ইউডিএফ ফাংশনটি কীভাবে বলা যেতে পারে

select dbo.ReplaceMultipleSpaces('   Sample   text  with  multiple  space     ')

0
 DECLARE @str varchar(150)
SET @str='Hello    My   name  is Jiyaul   mustafa'
Select REPLACE(REPLACE(REPLACE(@str,' ','{}'),'}{',''),'{}',' ')


0

কেবল অন্য পদ্ধতি যুক্ত করা-

এসকিউএল সার্ভারে রিপ্লেস ব্যবহার না করে একক স্পেসের সাথে একাধিক স্পেস প্রতিস্থাপন করা-

DECLARE @TestTable AS TABLE(input VARCHAR(MAX));

INSERT INTO @TestTable VALUES
('HAPPY         NEWYEAR     2020'),
('WELCOME       ALL     !');

SELECT
    CAST('<r><![CDATA[' + input + ']]></r>' AS XML).value('(/r/text())[1] cast as xs:token?','VARCHAR(MAX)')
    AS Expected_Result
FROM @TestTable;

--OUTPUT
/*
Expected_Result
HAPPY NEWYEAR 2020
WELCOME ALL !
*/

0

দয়া করে নীচের কোডটি সন্ধান করুন

select trim(string_agg(value,' ')) from STRING_SPLIT('  single    spaces   only  ',' ')
where value<>' '

এটি আমার পক্ষে কাজ করেছে .. আশা করি এটি সাহায্য করবে ...


-1

আপনি এটি চেষ্টা করতে পারেন:

select Regexp_Replace('single    spaces   only','( ){2,}', ' ') from dual;

@ রক্রাচর (150) SET @ str = 'হ্যালো ওয়েলকাম টু ওয়ার্ল্ড টু। নেট' রিপ্লেস (রিপ্লেস (রিপ্লেস (@ জাস্টার, '', '{}')), '} {', ''), 'Select } ',' ')
কোড

-3
update mytable
set myfield = replace(myfield, '  ',  ' ')
where myfield like '%  %'

এটা চেষ্টা কর..


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