SQL सर्वर में स्ट्रिंग से सभी रिक्त स्थान निकालें


222

SQL Server 2008 में स्ट्रिंग से सभी रिक्त स्थान को निकालने का सबसे अच्छा तरीका क्या है?

LTRIM(RTRIM(' a b ')) स्ट्रिंग के दाएं और बाएं सभी रिक्त स्थान हटा देगा, लेकिन मुझे बीच में स्थान हटाने की भी आवश्यकता है।


5
"सभी सफेद रिक्त स्थान" से क्या आपका मतलब केवल नियमित स्थान है? या, क्या आपका मतलब टैब, सीआर, एलएफ और अन्य वर्ण हैं जो सफेद स्थान के रूप में प्रदर्शित हो सकते हैं?
गॉर्डन लिनॉफ़

3
@GordonLinoff: मेरा मतलब नियमित स्थान
अनंत

जवाबों:


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
क्या होगा अगर शब्दों के बीच कई सफेद स्थान हैं? REPLACE एक समय में एक ही निकालता है। एक उपयोगकर्ता परिभाषित फ़ंक्शन लिखा जाना चाहिए जो कई रिक्त स्थान को निकालता है।
फरहान

यह सफेद रिक्त स्थान को बदलने के लिए प्रतीत नहीं होता है
रयान सैम्पसन

7
इसे हर जगह सभी व्हाट्सएप को बदलना चाहिए
एलेक्स के।

यह अनुगामी को छोड़कर सभी सफेद स्थानों को हटा देगा। ट्रेलिंग हटाने के लिए TRIM (REPLACE (fld_or_variable, '', '')) जोड़ें। कारण यह भी कई रिक्त स्थान को हटा दें क्योंकि ... अच्छी तरह से यह हर अंतरिक्ष पात्रों को बदलने के लिए कुछ भी नहीं है कि रिक्त स्थान एक-दूसरे के बगल में हैं या नहीं।
19

32
प्रतिस्थापित सभी रिक्त स्थान को भी पीछे छोड़ देता है। अगर ऐसा होने के बाद भी डेटा में स्पष्ट रूप से रिक्त स्थान हैं, तो संभावना है कि वे स्थान नहीं हैं, लेकिन टैब या कैरागी रिटर्न जैसे अनपेक्षित वर्ण हैं।
HLGEM


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 अपवोट मिले। ढेर अतिप्रवाह में आपका स्वागत है।
श्री जे।

@ Mr.J और अब यह 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कॉलम से सभी न्यूलाइन्स और स्पेस को हटाने के लिए उपयोग करना था । अगर मैंने char (13) और char (10) के बजाय '\ n' और 'r' का उपयोग किया तो यह काम नहीं किया।
जनवरी

इसे निष्पादित करने के लिए, "SET SQL_SAFE_UPDATES = 0;" चलाना आवश्यक है।
Shai Epstein


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
"@InputStr" लूप के शरीर में "@ResultStr" होना चाहिए।
जोजेलसन

@jjoelson क्या आप इस समारोह को बनाने और गलतियों को इंगित करने से पहले इसका परीक्षण करना चाहेंगे?
फरहान

7
क्षमा करें, मैं आपके उपरोक्त अनुमान के तहत काम कर रहा था कि REPLACE केवल एक समय में एक को निकालता है, इस स्थिति में यह फ़ंक्शन कई स्थानों के इनपुट के लिए एक अनंत लूप का कारण होगा। वास्तव में, जबकि लूप बिल्कुल भी आवश्यक नहीं है।
जोजेलसन

2
फरहान, अगर REPLACE ने आपके सोचने के तरीके पर काम किया तो @ jjoelson की पहली टिप्पणी सही है। अन्यथा आपके पास एक अनंत लूप होगा क्योंकि InputStr कभी नहीं बदलता है इसलिए ResultStr हमेशा पहला REPLACE परिणाम होगा। आपके कोड के काम करने का कारण यह है कि REPLACE को केवल 1 समय की आवश्यकता है। इसे दूसरी बार कभी नहीं कहा जाता है चाहे आप इसे किस स्ट्रिंग पर फेंक दें। एक काउंटर जोड़ें और प्रत्येक पुनरावृत्ति के साथ इसका प्रिंट आउट लें। यह हमेशा 1 होगा। REPLACE (InputStr, '', '') प्रत्येक स्थान को एक कॉल से हटा देगा।
गिल्बर्ट

6

यह स्ट्रिंग्स पर रिक्त स्थान को हटाने की चाल है:

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

2

यदि आपको सभी कॉलमों में TRIM रिक्त स्थान की आवश्यकता है, तो आप इस स्क्रिप्ट का उपयोग गतिशील रूप से करने के लिए कर सकते हैं:

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

बस एक टिप, यदि आप बदले हुए फ़ंक्शन से परेशान हैं, तो हो सकता है कि आप डेटाटाइप को nchar में सेट कर सकते हैं (जिस स्थिति में यह एक निश्चित लंबाई है और यह काम नहीं करेगा)।


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 )  

उदाहरण के लिए स्ट्रिंग में "HelloReplaceThingsGoing" प्रतिस्थापित शब्द को कैसे द्वारा प्रतिस्थापित किया गया है

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

0

एक कार्यात्मक संस्करण (udf) जो रिक्त स्थान, cr, lf, टैब या विन्यास को हटाता है।

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

परिणाम: '234asdfwefwef3x'

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

फिर मुझे यह परिणाम मिला: एमएसपी का परीक्षण करें

अगर किसी को मेरी जरूरत हो तो यहां पोस्ट करना।

चल रहा है: Microsoft SQL Server 2016 (SP2)


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 फ़ंक्शन के कई कॉल। लेकिन जब आपके पास किसी अज्ञात स्थान के साथ गतिशील आउटपुट होता है, तो यह काम नहीं करेगा। नियमित आधार पर इस समस्या से निपटने वाला कोई भी व्यक्ति जानता है कि REPLACE केवल एक ही स्थान को हटाएगा, सभी को नहीं, जैसा कि इसे करना चाहिए। और LTRIM और RTRIM में एक ही मुद्दा है। इसे Microsoft पर छोड़ दें। यहां एक नमूना आउटपुट है जो सभी 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

अब इसे एक कदम आगे ले जाएं और इसे अद्यतन या चयन कथन में उपयोग करें, इसे udf में बदलें।

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
"REPLACE केवल एक ही स्थान को हटा देगा।" ...वास्तव में? यह सरल डेमो सुझाव देता है: dbfiddle.uk/… । क्या आपको एक उदाहरण मिला है कि कहां काम नहीं करेगा?
एडीसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.