এসকিউএল সার্ভারের একটি স্ট্রিং থেকে সমস্ত স্পেস সরিয়ে ফেলুন


222

এসকিউএল সার্ভার ২০০৮-এর স্ট্রিং থেকে সমস্ত স্থান ফাঁকা করার সর্বোত্তম উপায় কী?

LTRIM(RTRIM(' a b ')) স্ট্রিংয়ের ডান এবং বামে সমস্ত শূন্যস্থান সরিয়ে ফেলবে, তবে মাঝখানে ফাঁকা স্থানটিও সরিয়ে ফেলতে হবে।


5
"সমস্ত সাদা স্থান" দ্বারা আপনি কি কেবলমাত্র নিয়মিত স্পেস বলতে চাইছেন? বা, আপনি কি এমন ট্যাব, সিআর, এলএফ এবং অন্যান্য অক্ষরগুলি বোঝান যা সাদা স্থান হিসাবে প্রদর্শিত হতে পারে?
গর্ডন লিনফ

3
@ গর্ডনলিনফ: আমি নিয়মিত স্পেস বোঝাতে চাইছিলাম
অনন্ত

উত্তর:


385

কেবল এটি প্রতিস্থাপন;

SELECT REPLACE(fld_or_variable, ' ', '')

সম্পাদনা: কেবল স্পষ্ট করার জন্য; তার একটি বিশ্বব্যাপী প্রতিস্থাপন, সেখানে কোন প্রয়োজন নেই trim()বা পারেন জন্য একাধিক স্পেস সম্পর্কে চিন্তা charবা varchar:

create table #t (
    c char(8),
    v varchar(8))

insert #t (c, v) values 
    ('a a'    , 'a a'    ),
    ('a a  '  , 'a a  '  ),
    ('  a a'  , '  a a'  ),
    ('  a a  ', '  a a  ')

select
    '"' + c + '"' [IN], '"' + replace(c, ' ', '') + '"' [OUT]
from #t  
union all select
    '"' + v + '"', '"' + replace(v, ' ', '') + '"'
from #t 

ফলাফল

IN             OUT
===================
"a a     "     "aa"
"a a     "     "aa"
"  a a   "     "aa"
"  a a   "     "aa"
"a a"          "aa"
"a a  "        "aa"
"  a a"        "aa"
"  a a  "      "aa"

2
শব্দের মধ্যে যদি একাধিক সাদা স্থান থাকে? প্রতিস্থাপন একবারে কেবল একটিকে সরিয়ে দেয়। একটি ব্যবহারকারী সংজ্ঞায়িত ফাংশন লিখতে হবে যা একাধিক স্পেস সরিয়ে দেয়।
ফারহান

দেখে মনে হচ্ছে এটি সাদা স্থানগুলি অনুসরণ করবে না
রায়ান স্যাম্পসন

7
এটি সমস্ত সাদা জায়গার স্থান সর্বত্র প্রতিস্থাপন করা উচিত
অ্যালেক্স কে।

এটি ট্রেইলিং বাদে সমস্ত সাদা স্থান সরিয়ে ফেলবে। ট্রেলিং অপসারণ করতে ট্রিম যুক্ত করুন (পুনরায় (fld_or_variable, '', ''))। এটি এমনকি একাধিক স্পেস অপসারণ করার কারণটি হ'ল ... ভাল এটি প্রতিটি স্থানের অক্ষরকে কিছুতেই বদলে দেয় না ther
স্ন্যাপলেমাউটন

32
প্রতিস্থাপন এমনকি সমস্ত স্থান ফাঁসিয়ে দেয় এমনকি একটিকে অনুসরণ করে। এটি সম্পন্ন করার পরে যদি ডেটাতে এখনও শিক্ষানবিশ স্পেস থাকে তবে সম্ভবত তারা শূন্যস্থান নয় তবে ট্যাব বা ক্যারেজ ফেরতের মতো ছাপানো অক্ষর নয়।
এইচএলজিইএম


28

যদি এটি কোনও টেবিলের আপডেট হয় তবে আপনাকে 0 টি সারি প্রভাবিত না করা পর্যন্ত আপনাকে একাধিক বার এই আপডেটটি চালাতে হবে।

update tableName
set colName = REPLACE(LTRIM(RTRIM(colName)), '  ', ' ')
where colName like '%  %'


11

রেফারেন্স এই ব্লগ থেকে নেওয়া:

প্রথমে নমুনা সারণী এবং ডেটা তৈরি করুন:

CREATE TABLE tbl_RemoveExtraSpaces
(
     Rno INT
     ,Name VARCHAR(100)
)
GO

INSERT INTO tbl_RemoveExtraSpaces VALUES (1,'I    am     Anvesh   Patel')
INSERT INTO tbl_RemoveExtraSpaces VALUES (2,'Database   Research and     Development  ')
INSERT INTO tbl_RemoveExtraSpaces VALUES (3,'Database    Administrator     ')
INSERT INTO tbl_RemoveExtraSpaces VALUES (4,'Learning    BIGDATA    and       NOSQL ')
GO

অতিরিক্ত স্থান ছাড়াই স্ট্রিং নির্বাচন করতে স্ক্রিপ্ট:

SELECT
     [Rno]
    ,[Name] AS StringWithSpace
    ,LTRIM(RTRIM(REPLACE(REPLACE(REPLACE([Name],CHAR(32),'()'),')(',''),'()',CHAR(32)))) AS StringWithoutSpace
FROM tbl_RemoveExtraSpaces

ফলাফল:

Rno         StringWithSpace                                 StringWithoutSpace
----------- -----------------------------------------  ---------------------------------------------
1           I    am     Anvesh   Patel                      I am Anvesh Patel
2           Database   Research and     Development         Database Research and Development
3           Database    Administrator                       Database Administrator
4           Learning    BIGDATA    and       NOSQL          Learning BIGDATA and NOSQL

2
আপনি কি বুঝতে পেরেছেন যে ওপি একা একাধিক স্পেস প্রতিস্থাপনের পরিবর্তে সমস্ত স্থান সরিয়ে ফেলতে চেয়েছিল?
কাই

3
এটি ওপি দ্বারা প্রয়োজনীয় উত্তর হিসাবে নয়, পরিবর্তে এটি 4 টি upvotes পেয়েছে কারণ এটি হ্রাস করা উচিত ছিল। স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম।
মিঃ জে

@ মিঃ জে এবং এখন এটি 9.।
লেজেক পি

11

100% কাজ করছে

UPDATE table_name SET  "column_name"=replace("column_name", ' ', ''); //Remove white space

UPDATE table_name SET  "column_name"=replace("column_name", '\n', ''); //Remove newline

UPDATE table_name SET  "column_name"=replace("column_name", '\t', ''); //Remove all tab

আপনি ব্যবহার করতে পারেন "column_name"বাcolumn_name

ধন্যবাদ

সুব্রত


2
আমাকে select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')একটি varcharকলাম থেকে সমস্ত নতুনলাইন এবং স্পেসগুলি সরাতে ব্যবহার করতে হয়েছিল । আমি যদি চরের (13) এবং চর (10) এর পরিবর্তে '\ n' এবং '\ r' ব্যবহার করি তবে এটি কার্যকর হয়নি।
জানুয়ারী

এটি কার্যকর করতে, এটি "এসইটি এসকিউএলরি0_UPDATES = 0" চালানো দরকার;
শাই অ্যাপস্টাইন


6

যদি স্ট্রিংয়ে একাধিক সাদা স্পেস থাকে তবে প্রতিস্থাপনটি সঠিকভাবে কাজ নাও করতে পারে। তার জন্য, নিম্নলিখিত ফাংশনটি ব্যবহার করা উচিত।

CREATE FUNCTION RemoveAllSpaces
(
    @InputStr varchar(8000)
)
RETURNS varchar(8000)
AS
BEGIN
declare @ResultStr varchar(8000)
set @ResultStr = @InputStr
while charindex(' ', @ResultStr) > 0
    set @ResultStr = replace(@InputStr, ' ', '')

return @ResultStr
END

উদাহরণ:

select dbo.RemoveAllSpaces('aa  aaa       aa aa                 a')

আউটপুট:

aaaaaaaaaa

1
"@ ইনপুটএসটিআর" এ সময় লুপের শরীরে "@ResultStr" হওয়া উচিত।
জাজোয়েলসন

@ জাজোয়েলসন আপনার এই ফাংশনটি তৈরি করে ভুলগুলি নির্দেশ করার আগে এটি পরীক্ষা করে দেখতে মন চান?
ফারহান

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

2
ফারহান, যদি আপনি যদি মনে করেন যে রিপ্লেসটি যদি এটির মতো কাজ করে তবে @ জোজেলসনের প্রথম মন্তব্যটি সঠিক। অন্যথায় আপনার একটি অসীম লুপ থাকবে কারণ ইনপুটস্ট্রিআর কখনই পরিবর্তন হয় না তাই রেজাল্টএসআরটি সর্বদা প্রথম REPLACE ফলাফল হবে। আপনার কোডটি কাজ করার কারণ হ'ল REPLACE কেবল 1 বার প্রয়োজন। এটিকে দ্বিতীয় বার বলা হয় না তা আপনি কোনও স্ট্রিং নিক্ষেপ করুন। একটি কাউন্টার যুক্ত করুন এবং প্রতিটি পুনরাবৃত্তির সাথে মুদ্রণ করুন। এটি সর্বদা 1. হবে RE প্রতিস্থাপন (ইনপুটসার্ট, '', '') এক কল দিয়ে প্রতিটি স্থান সরিয়ে ফেলবে।
গিলবার্ট

6

এটি স্ট্রিংগুলিতে ফাঁকা স্থান সরিয়ে দেওয়ার কৌশল করে:

UPDATE
    tablename
SET
    columnname = replace(columnname, ' ', '');

2

আপনার যদি সমস্ত কলামে স্পেস স্পেস প্রয়োজন হয়, আপনি এই স্ক্রিপ্টটি এটি গতিশীলভাবে করতে ব্যবহার করতে পারেন:

--Just change table name
declare @MyTable varchar(100)
set @MyTable = 'MyTable'

--temp table to get column names and a row id
select column_name, ROW_NUMBER() OVER(ORDER BY column_name) as id into #tempcols from INFORMATION_SCHEMA.COLUMNS 
WHERE   DATA_TYPE IN ('varchar', 'nvarchar') and TABLE_NAME = @MyTable

declare @tri int
select @tri = count(*) from #tempcols
declare @i int
select @i = 0
declare @trimmer nvarchar(max)
declare @comma varchar(1)
set @comma = ', '

--Build Update query
select @trimmer = 'UPDATE [dbo].[' + @MyTable + '] SET '

WHILE @i <= @tri 
BEGIN

    IF (@i = @tri)
        BEGIN
        set @comma = ''
        END
    SELECT  @trimmer = @trimmer + CHAR(10)+ '[' + COLUMN_NAME + '] = LTRIM(RTRIM([' + COLUMN_NAME + ']))'+@comma
    FROM    #tempcols
    where id = @i

    select @i = @i+1
END

--execute the entire query
EXEC sp_executesql @trimmer

drop table #tempcols

2

আপনি যদি স্ট্রিং থেকে শূন্যস্থান, - এবং অন্য পাঠ্য সরাতে চান তবে নিম্নলিখিত ব্যবহার করুন:

ধরুন আপনার টেবিলটিতে '718-378-4957' বা '7183784957' এর মতো আপনার একটি মোবাইল নম্বর রয়েছে এবং আপনি প্রতিস্থাপন করে মোবাইল নম্বর পেতে চান তবে নীচের পাঠ্যটি ব্যবহার করুন।

select replace(replace(replace(replace(MobileNo,'-',''),'(',''),')',''),' ','') from EmployeeContactNumber

ফলাফল: - 7183784957


2

কেবলমাত্র একটি টিপ, যদি আপনার প্রতিস্থাপন ফাংশনে সমস্যা হয় তবে আপনার ডাটাটাইপটি এনচারে সেট করা থাকতে পারে (এক্ষেত্রে এটি একটি নির্দিষ্ট দৈর্ঘ্য এবং এটি কাজ করবে না)।


2


2

এটি আমার জন্য দরকারী:

CREATE FUNCTION dbo.TRIM(@String VARCHAR(MAX))
RETURNS VARCHAR(MAX)
BEGIN
    RETURN LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@String,CHAR(10),'[]'),CHAR(13),'[]'),char(9),'[]'),CHAR(32),'[]'),'][',''),'[]',CHAR(32))));
END
GO


1

আমার আজ এই সমস্যাটি ছিল এবং নীচে দেখুন ট্রিকটি প্রতিস্থাপন / ছাঁটাই করুন।

update table_foo 
set column_bar  = REPLACE(LTRIM(RTRIM(column_bar)), '  ', '')

আগপাছ :

old-bad:  column_bar    |   New-fixed:   column_bar
       '  xyz  '        |                'xyz'   
       '  xyz  '        |                'xyz' 
       '  xyz  '        |                'xyz' 
       '  xyz  '        |                'xyz' 
       '  xyz  '        |                'xyz' 
       '  xyz  '        |                'xyz' 

1
কেন বিরক্ত LTRIM& RTRIM?
ব্যাংকসসান

কুল। আপনার কি উদাহরণ আছে?
ব্যাংকসসান

0

বাম এবং ডানদিকে একটি স্ট্রিংয়ের ফাঁকা স্থান সরাতে। মধ্যম ব্যবহারে স্থান অপসারণ করতে Replace

আপনি RTRIM()ডান থেকে স্পেসগুলি অপসারণ করতে এবং LTRIM()বাম থেকে ফাঁকা স্থানগুলি অপসারণ করতে ব্যবহার করতে পারেন তাই বাম এবং ডান স্পেসগুলি নিম্নরূপে সরানো হয়েছে:

SELECT * FROM table WHERE LTRIM(RTRIM(username)) = LTRIM(RTRIM("Bob alias baby"))

0

একটি নির্দিষ্ট অক্ষর প্রতিস্থাপনের জন্য সিনট্যাক্স:

REPLACE ( string_expression , string_pattern , string_replacement )  

উদাহরণস্বরূপ, "হ্যালোরেপ্লেসথিংসগিং" স্ট্রিং-এ প্রতিস্থাপন শব্দটি কীভাবে প্রতিস্থাপন করা হয়

SELECT REPLACE('HelloReplaceThingsGoing','Replace','How');
GO

0

একটি ক্রিয়ামূলক সংস্করণ (udf) যা স্পেস, ক্র, এলএফ, ট্যাবগুলি বা কনফিগারযোগ্য মুছে ফেলে।

select Common.ufn_RemoveWhitespace(' 234   asdf   wefwef 3  x   ', default) as S

ফলাফল: '234 এসএসডিউইউফওয়েফ3 এক্স'

alter function Common.RemoveWhitespace
(
    @pString nvarchar(max),
    @pWhitespaceCharsOpt nvarchar(max) = null -- default: tab, lf, cr, space 
)  
returns nvarchar(max) as
/*--------------------------------------------------------------------------------------------------
    Purpose:   Compress whitespace

    Example:  select Common.ufn_RemoveWhitespace(' 234   asdf   wefwef 3  x   ', default) as s 
              -- Result: 234asdfwefwef3x

    Modified    By          Description
    ----------  ----------- --------------------------------------------------------------------
    2018.07.24  crokusek    Initial Version 
  --------------------------------------------------------------------------------------------------*/ 
begin    
    declare 
        @maxLen bigint = 1073741823, -- (2^31 - 1) / 2 (https://stackoverflow.com/a/4270085/538763)
        @whitespaceChars nvarchar(30) = coalesce(
            @pWhitespaceCharsOpt, 
            char(9) + char(10) + char(13) + char(32));  -- tab, lf, cr, space

    declare
        @whitespacePattern nvarchar(30) = '%[' + @whitespaceChars + ']%',
        @nonWhitespacePattern nvarchar(30) = '%[^' + @whitespaceChars + ']%',
        @previousString nvarchar(max) = '';

    while (@pString != @previousString)
    begin
        set @previousString = @pString;

        declare
            @whiteIndex int = patindex(@whitespacePattern, @pString);

        if (@whiteIndex > 0)
        begin                   
            declare 
                @whitespaceLength int = nullif(patindex(@nonWhitespacePattern, substring(@pString, @whiteIndex, @maxLen)), 0) - 1;                

            set @pString = 
                substring(@pString, 1, @whiteIndex - 1) + 
                iif(@whiteSpaceLength > 0, substring(@pString, @whiteIndex + @whiteSpaceLength, @maxLen), '');
        end        
    end        
    return @pString;
end
go

0

কিছু কারণে প্রতিস্থাপনটি প্রতিবার কেবল একটি স্ট্রিং দিয়ে কাজ করে। আমার এই " টেস্ট এমএসপি'র মতো স্ট্রিং ছিল " এর এবং আমি কেবল একটি স্থান রেখে যেতে চাই।

@ ফারহান যে পদ্ধতিটি ব্যবহার করেছিলেন আমি তা ব্যবহার করেছি, তবে কিছু পরিবর্তন সহ:

CREATE FUNCTION ReplaceAll
(
    @OriginalString varchar(8000),
    @StringToRemove varchar(20),
    @StringToPutInPlace varchar(20)
)
RETURNS varchar(8000)
AS
BEGIN
declare @ResultStr varchar(8000)
set @ResultStr = @OriginalString
while charindex(@StringToRemove, @ResultStr) > 0
    set @ResultStr = replace(@ResultStr, @StringToRemove, @StringToPutInPlace)

return @ResultStr
END

তারপরে আমি আমার আপডেটটি এভাবে চালাই

UPDATE tbTest SET Description = dbo.ReplaceAll(Description, '  ', ' ') WHERE ID = 14225

তারপরে আমি এই ফলাফল পেয়েছি: টেস্ট এমএসপি

আমার মতো যদি কারওর প্রয়োজন হয় তবে এখানে পোস্ট করা।

চলছে: মাইক্রোসফ্ট এসকিউএল সার্ভার 2016 (এসপি 2)


0

নীচের স্ক্রিপ্টটি পরীক্ষা করে দেখুন (ইউনিট পরীক্ষিত) -

--Declaring
DECLARE @Tbl TABLE(col_1 VARCHAR(100));

--Test Samples
INSERT INTO @Tbl (col_1)
VALUES
('  EY     y            
Salem')
, ('  EY     P    ort       Chennai   ')
, ('  EY     Old           Park   ')
, ('  EY   ')
, ('  EY   ')
,(''),(null),('d                           
    f');

SELECT col_1 AS INPUT,
    LTRIM(RTRIM(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
    REPLACE(
        REPLACE(
        REPLACE(
        REPLACE(
        REPLACE(
        REPLACE(
        REPLACE(col_1,CHAR(10),' ')
        ,CHAR(11),' ')
        ,CHAR(12),' ')
        ,CHAR(13),' ')
        ,CHAR(14),' ')
        ,CHAR(160),' ')
        ,CHAR(13)+CHAR(10),' ')
    ,CHAR(9),' ')
    ,' ',CHAR(17)+CHAR(18))
    ,CHAR(18)+CHAR(17),'')
    ,CHAR(17)+CHAR(18),' ')
    )) AS [OUTPUT]
FROM @Tbl;

-1

দেখে মনে হচ্ছে যে প্রত্যেকে একক REPLACE ফাংশন উল্লেখ করে চলেছে। এমনকি একটি রিপ্লেস ফাংশনের অনেকগুলি কল। কিন্তু যখন আপনার অজানা সংখ্যক স্পেস দিয়ে ডায়নামিক আউটপুট থাকে, তখন এটি কাজ করবে না। এই সমস্যাটির নিয়মিত ভিত্তিতে যে কেউ লেনদেন করে যে জানে যে প্রতিস্থাপনটি কেবল একটি স্থানই সরিয়ে ফেলবে, সমস্ত কিছু নয়, যেমনটি করা উচিত। এবং এলটিআরআইএম এবং আরটিআরআইএম একই সমস্যা বলে মনে হচ্ছে। মাইক্রোসফ্ট এ ছেড়ে দিন। এখানে একটি নমুনা আউটপুট যা সমস্ত CHAR (32) মান (স্পেস) অপসারণের জন্য WHILE লুপ ব্যবহার করে।

DECLARE @INPUT_VAL  VARCHAR(8000)
DECLARE @OUTPUT_VAL VARCHAR(8000)

SET @INPUT_VAL = '      C               A                         '
SET @OUTPUT_VAL = @INPUT_VAL
WHILE CHARINDEX(CHAR(32), @OUTPUT_VAL) > 0 BEGIN
    SET @OUTPUT_VAL = REPLACE(@INPUT_VAL, CHAR(32), '')
END

PRINT 'START:' + @INPUT_VAL + ':END'
PRINT 'START:' + @OUTPUT_VAL + ':END'

উপরের কোডটির আউটপুট এখানে দেওয়া হল:

START:      C               A                         :END
START:CA:END

এখন এটিকে আরও একধাপ এগিয়ে নিয়ে যেতে এবং আপডেট বা নির্বাচনী বিবৃতিতে এটি ব্যবহার করতে, এটি একটি ইউডিএফ-তে পরিবর্তন করুন।

CREATE FUNCTION udf_RemoveSpaces (@INPUT_VAL    VARCHAR(8000))
RETURNS VARCHAR(8000)
AS 
BEGIN

DECLARE @OUTPUT_VAL VARCHAR(8000)
SET @OUTPUT_VAL = @INPUT_VAL
-- ITTERATE THROUGH STRING TO LOOK FOR THE ASCII VALUE OF SPACE (CHAR(32)) REPLACE IT WITH BLANK, NOT NULL
WHILE CHARINDEX(CHAR(32), @OUTPUT_VAL) > 0 BEGIN
    SET @OUTPUT_VAL = REPLACE(@INPUT_VAL, CHAR(32), '')
END

RETURN @OUTPUT_VAL
END

তারপরে একটি নির্বাচন বা INSERT বিবৃতিতে ফাংশনটি ব্যবহার করুন:

UPDATE A
SET STATUS_REASON_CODE = WHATEVER.dbo.udf_RemoveSpaces(STATUS_REASON_CODE)
FROM WHATEVER..ACCT_INFO A
WHERE A.SOMEVALUE = @SOMEVALUE

INSERT INTO SOMETABLE
(STATUS_REASON_CODE)
SELECT WHATEVER.dbo.udf_RemoveSpaces(STATUS_REASON_CODE)
FROM WHATEVER..ACCT_INFO A
WHERE A.SOMEVALUE = @SOMEVALUE

1
"প্রতিস্থাপন কেবল একটি একক স্থান সরিয়ে ফেলবে" " ... তাই? এই সাধারণ ডেমোটি পরামর্শ দেয় না: dbfiddle.uk/… । আপনি কাজ করেন না যেখানে উদাহরণ আছে?
এডিসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.