SQL Server'da bir dizeden tüm boşlukları kaldırın


222

SQL Server 2008'de bir dizeden tüm boşlukları kaldırmanın en iyi yolu nedir?

LTRIM(RTRIM(' a b ')) dizenin sağındaki ve solundaki tüm boşlukları kaldıracak, ancak ortadaki boşluğu da kaldırmam gerekiyor.


5
"Tüm beyaz boşluklar" ile sadece normal boşluklar mı kastedilmektedir? Veya sekme, CR, LF ve boşluk olarak görüntülenebilecek diğer karakterleri mi kastediyorsunuz?
Gordon Linoff

3
@LordonLinoff: Düzenli alanlar demek istedim
Ananth

Yanıtlar:


385

Basitçe değiştirin;

SELECT REPLACE(fld_or_variable, ' ', '')

Düzenleme: Sadece açıklığa kavuşturmak için; onun global yerine, hiçbir gerek yoktur trim()biri için birden çok boşluk hakkında veya endişe charya 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 

Sonuç

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
Sözcükler arasında birden fazla beyaz boşluk varsa ne olur? REPLACE her seferinde yalnızca bir tane kaldırır. Birden çok boşluğu kaldıran kullanıcı tanımlı bir işlev yazılmalıdır.
Farhan

Bu, arkadaki boşlukların yerini almıyor gibi görünüyor
Ryan Sampson 21

7
Her yerdeki tüm boşlukları değiştirmeli
Alex K.

Sondaki boşluklar dışındaki tüm beyaz boşlukları SİLECEKTİR İzlemeyi kaldırmak için TRIM'i ekleyin (REPLACE (fld_or_variable, '', '')). Birden fazla boşluğu bile kaldırmasının nedeni, ... her boşluk karakterini, boşlukların yan yana olsun veya olmasın hiçbir şeye değiştirmemesidir.
snaplemouton

32
Değiştir, bir boşluk bile olsa tüm boşlukları kaldırır. Bu yapıldıktan sonra verilerde hala boşluklar varsa, büyük olasılıkla boşluk değil, sekme veya carraige döndürmesi gibi yazdırılamaz karakterler olabilir.
HLGEM


28

Bir tablodaki bir güncelleştirme ise, yapmanız gereken tek şey bu güncellemeyi 0 satırı etkileyene kadar birkaç kez çalıştırmaktır.

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


11

Bu blogdan alınan referans:

İlk olarak, örnek tablo ve veriler oluşturun:

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

Ekstra Boşluk Olmadan SELECT dizesine komut dosyası:

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

Sonuç:

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
OP'nin birden fazla alanı tek bir alanla değiştirmek yerine TÜM alanları kaldırmak istediğini biliyor musunuz?
Kaii

3
Cevabın OP'nin gerektirmediği için bu indirilmemeliydi, ancak bunun yerine 4 oy aldı. Stack Overflow'a hoş geldiniz.
Mr.J

@ Mr.J ve şimdi 9. Çılgın bir dünya var.
Leszek P

11

% 100 çalışma

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

Sen kullanabilirsiniz "column_name"veyacolumn_name

Teşekkürler

Subroto


2
select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')Bir varcharsütundaki tüm yeni satırları ve boşlukları kaldırmak için kullanmak zorunda kaldım . Char (13) ve char (10) yerine '\ n' ve '\ r' kullandıysam işe yaramadı.
Jan

bunu yürütmek için "SET SQL_SAFE_UPDATES = 0;"
Shai Epstein


6

Bir dizede birden çok beyaz boşluk varsa, değiştirme işlemi düzgün çalışmayabilir. Bunun için aşağıdaki fonksiyon kullanılmalıdır.

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

Misal:

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

Çıktı:

aaaaaaaaaa

1
While döngüsünün gövdesinde "@InputStr" "@ResultStr" olmalıdır.
jjoelson

@jjoelson, bu işlevi oluşturup hataları işaret etmeden önce test etmeyi düşünür müsünüz?
Farhan

7
Maalesef, REPLACE'in her seferinde yalnızca bir tane kaldırdığı varsayımı altında çalışıyordum, bu durumda bu işlev birden çok boşluğa sahip girişler için sonsuz bir döngüye neden olur. Gerçekte while döngüsü hiç gerekli değildir.
jjoelson

2
Farhan, eğer REPLACE düşündüğünüz şekilde çalıştıysa, @ jjoelson'ın ilk yorumu doğrudur. Aksi takdirde sonsuz bir döngüye sahip olursunuz çünkü InputStr asla değişmez, bu nedenle ResultStr her zaman ilk REPLACE sonucu olacaktır. Kodunuzun çalışmasının nedeni, DEĞİŞTİR'e yalnızca 1 kez ihtiyaç duyulmasıdır. Hangi dize attığınıza bakılmaksızın asla ikinci kez çağrılmaz. Bir sayaç ekleyin ve her yinelemeyle yazdırın. Her zaman 1 olacaktır. REPLACE (InputStr, '', '') her alanı tek bir çağrı ile kaldıracaktır.
Gilbert

6

Bu, dizelerdeki boşlukları kaldırma hile yapar:

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

2

Tüm sütunlardaki boşlukları TRIM yapmanız gerektiğinde, bu komut dosyasını dinamik olarak yapmak için kullanabilirsiniz:

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

boşlukları, - ve dizeden başka bir metni kaldırmak istiyorsanız aşağıdakileri kullanın:

Tablonuzda '718-378-4957' veya '7183784957' gibi bir cep telefonu numaranız olduğunu varsayalım ve cep telefonu numarasını değiştirmek ve almak istiyorsanız, aşağıdaki Metni kullanın.

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

Sonuç: - 7183784957


2

Yalnızca bir ipucu, eğer değiştirme fonksiyonu ile sorun yaşıyorsanız, veri tipini nchar olarak ayarlamış olabilirsiniz (bu durumda sabit bir uzunluktur ve çalışmaz).


2


2

bu benim için yararlı:

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

Bugün bu sorunu vardı ve yerine / trim hile yaptı ... aşağıya bakın.

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

önce ve sonra :

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

1
Neden LTRIM& ile uğraşıyorsunuz RTRIM?
BanksySan

Güzel. Örneğin var mı?
BanksySan

0

Bir dizedeki boşlukları sola ve sağa kaldırmak için. Orta kullanımda boşluğu kaldırmak için Replace.

Sen kullanabilirsiniz RTRIM()sağdan boşlukları kaldırmak için ve LTRIM()aşağıdaki gibi çıkarılır sol dolayısıyla sol ve sağ alanlardan boşlukları kaldırmak için:

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

0

Belirli bir karakteri değiştirmek için sözdizimi:

REPLACE ( string_expression , string_pattern , string_replacement )  

Örneğin, "HelloReplaceThingsGoing" dizesinde Kelimeyi değiştir yerine Nasıl kullanılır?

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

0

Boşlukları, cr, lf, sekmeleri veya yapılandırılabilirleri kaldıran işlevsel bir sürüm (udf).

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

Sonuç: '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

Nedense, değiştirme her seferinde yalnızca bir dize ile çalışır. Bu " MSP Test " gibi bir dize vardı ve sadece bir boşluk bırakmak istiyorum.

@Farhan'ın yaptığı yaklaşımı kullandım, ancak bazı değişikliklerle:

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

Sonra güncellememi böyle çalıştırıyorum

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

Sonra bu sonucu aldım: Test MSP

Birisi benim yaptığım gibi ihtiyacı varsa buraya gönderme.

Çalışıyor: Microsoft SQL Server 2016 (SP2)


0

Aşağıdaki komut dosyasını kontrol edin ve deneyin (Birim Test Edildi) -

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

Herkesin tek bir REPLACE fonksiyonundan bahsettiği görülüyor. Ya da bir REPLACE fonksiyonunun birçok çağrısı. Ancak, bilinmeyen sayıda alana sahip dinamik çıktınız olduğunda, çalışmaz. Bu konuyu düzenli olarak ele alan herkes, REPLACE'in gerektiği gibi TÜM DEĞİL yalnızca tek bir alanı kaldıracağını bilir. LTRIM ve RTRIM'de de aynı sorun var gibi görünüyor. Microsoft'a bırakın. İşte TÜM CHAR (32) değerlerini (boşluk) kaldırmak için WHILE Döngüsü kullanan bir örnek çıktı.

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'

Yukarıdaki kodun çıktısı:

START:      C               A                         :END
START:CA:END

Şimdi bir adım ileri gidip bir UPDATE veya SELECT deyiminde kullanmak için udf olarak değiştirin.

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

Sonra işlevi SELECT veya INSERT deyiminde kullanın:

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 yalnızca tek bir alanı kaldıracak." ...Gerçekten mi? Bu basit demo şunları önermez : dbfiddle.uk/… . Bunun işe yaramayacağına dair bir örnek var mı?
ADyson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.