T-SQL में सिंगल स्पेस वाले डुप्लिकेट स्पेस को बदलें


100

मुझे यह सुनिश्चित करने की आवश्यकता है कि किसी दिए गए फ़ील्ड में वर्णों के बीच एक से अधिक स्थान नहीं हैं (मैं सभी सफेद स्थान, बस स्थान के बारे में चिंतित नहीं हूं)।

इसलिए

'single    spaces   only'

में बदल दिया जाना चाहिए

'single spaces only'

नीचे काम नहीं चलेगा

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

जैसा कि इसमें होगा

'single  spaces  only'

मैं वास्तव में सीएलआर आधारित समाधान के बजाय देशी टी-एसक्यूएल के साथ रहना पसंद करूंगा।

विचार?


आप इसे रेजेक्स रिप्लेस
राज मोर

जवाबों:


325

यहां तक ​​कि tidier:

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

आउटपुट:

सिंगल स्पेस का चयन करें


6
यदि आप स्ट्रिंग के सामने और अंत में रिक्त स्थान को निकालना चाहते हैं, तो प्रतिस्थापित को LTRIM, RTRIM में लपेटें और यह आपके लिए करेगा।
नील नाइट

5
जब तक आपके तार में बहुत सारे <या> चिह्न नहीं होते हैं। मेरी पसंद के हिसाब से नाजुक लगता है।
जॉन एफएक्स

8
सच में सुंदर हैक। Upvoted। यदि इनपुट में संभावित रूप से कोई दो वर्ण मध्य भाग के लिए उपयोग किए जा सकते हैं।
रीचर्डलेंट

32
क्रिस, आप गैर-मुद्रण योग्य ASCII वर्ण जैसे CHAR (17) और CHAR (18) का उपयोग कर सकते हैं, क्योंकि ये आपके इनपुट पाठ में कभी नहीं होंगे। अभी भी स्वीकृत उत्तर की लूपिंग से अधिक तेज़ है।
२६:२० पर richardtallent

7
मुझे यह देखने के लिए एक क्षण के लिए देखना था कि आपने '> <', '' कोई स्थान नहीं बदला लेकिन अब मैं इसे प्राप्त करता हूं ... यह बहुत ही शानदार है। मैंने गैर-मुद्रण योग्य ASCII वर्णों के संयोजन का उपयोग करने के @richardtallent सुझाव को बहुत पसंद किया, जिसमें से जोड़ा गया संयोजन: REPLACE (REPLACE (REPLACE (LastName, ''), '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

1
फंक्शन में रैपिंग और वर्कर बदलना (100) से नवरच (अधिकतम)
क्रिस्टोफ

जेम्स और नील की लिपियों के बीच अंतर यह है कि जेम्स हालांकि लूप चलाते हैं, जबकि व्यक्तिगत अनुभव में, यह चल रहा है, हालांकि एक मेज के 50,000 रिकॉर्ड बहुत धीमी गति से चलते हैं, इसलिए आपको इसे एक प्रक्रिया के रूप में बनाने की आवश्यकता है और एक रिकॉर्ड और कुछ में पारित करना होगा नौकरियों में आपको बैंड नई प्रक्रिया बनाने की अनुमति नहीं हो सकती है। नील के प्रति-मौजूदा कार्यों का उपयोग करता है क्योंकि यह <> का उपयोग करता है, अगर आपके पास एक तार है जैसे कि "release < now"आप प्राप्त करेंगे "release<><><<><>now", और "release<<>now", "release< now"किसी भी जोड़ी के प्रतीकों के साथ इसका एक ही है, यदि आपके पास एक जोड़ी है, तो यह स्थानांतरित होने जा रहा है
मेमोर-एक्स

1
इसे 50k रिकॉर्ड के माध्यम से चलाने पर तेजी से हल्का होना चाहिए, अगर आपकी समस्या है तो मैं अन्य मुद्दों पर ध्यान दूंगा।
user3486773

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

ब्रैड, मेरे पास लगभग समान कोड था लेकिन आपने मुझे पोस्ट में हरा दिया, इसलिए अपवोट हो गया। मल्टीपल रिप्ले () कॉल हैक है, लेकिन यदि अपेक्षित "अतिरिक्त" रिक्त स्थान की संख्या अनुमानित और अपेक्षाकृत कम है, तो यह ठीक होगा और ओपी की आवश्यकता को पूरा करने के लिए RegEx कोड CLR के माध्यम से कॉल नहीं करेगा।
richardtallent

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

प्रतिस्थापित सभी दोहरे स्थानों पर काम करेगा, कई जगह लगाने की आवश्यकता नहीं है। यह सेट-आधारित समाधान है।


क्या यह 2 में 4 रिक्त स्थान नहीं गिराएगा?
क्रिस्टोफ

मैंने अपने प्रश्नों में इस समाधान को जरूरत न पूरा करने वाला कहा, लेकिन धन्यवाद।
क्रिस्टोफ

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 या @Neil नाइट (लेकिन सुरक्षित) द्वारा वर्णित विधि के आधार पर समाधान
दोनों उदाहरण ऊपर आउटपुट वापस करते हैं:

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

यह काम किस प्रकार करता है: यहां छवि विवरण दर्ज करें

सावधानी:
रिक्त स्थान को बदलने के लिए उपयोग किए जाने वाले चार / स्ट्रिंग स्ट्रिंग के आरंभ या अंत में मौजूद नहीं होने चाहिए और अकेले खड़े होने चाहिए।


1
मुझे इसके लिए एक पुनरावर्ती कार्य के विचार की तरह है। क्या किसी चीज़ की जानकारी है?
Zach Smith

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

2

यहाँ एक सरल कार्य है जिसे मैंने पहले या बाद में, और एक स्ट्रिंग के भीतर कई स्थानों की सफाई के लिए बनाया है। यह एक स्ट्रेच में लगभग 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-multiple-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

मैं एक जगह में कई स्थानों को बदलने के लिए XML पथ समाधान के लिए उपयोग करता हूं

विचार को XML टैग के साथ रिक्त स्थान बदलने के लिए है फिर XML स्ट्रिंग को बिना स्ट्रिंग टैग में विभाजित करें।

यहां बताया गया है कि अंतिम यूडीएफ फ़ंक्शन कैसे कहा जा सकता है

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 @s varchar(50)
set @s = 'TEST         TEST'
select REPLACE(REPLACE(REPLACE(@s,' ','[o][c]'),'[c][o]',''),'[o][c]',' ')

0

बस एक और तरीका जोड़ना-

SQL सर्वर में REPLACE का उपयोग किए बिना एकल स्थान के साथ कई रिक्त स्थान की जगह-

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;

DECLARE @str varchar (150) SET @ str = 'हेल्लो वेलकम टू द वर्ल्ड ऑफ .net' का चयन करें } ',' ')
कोड

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

इसे इस्तेमाल करे..


मैंने अपने प्रश्नों में इस समाधान को जरूरत न पूरा करने वाला कहा, लेकिन धन्यवाद।
क्रिस्टोफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.