Hapus semua spasi dari string di SQL Server


222

Apa cara terbaik untuk menghapus semua spasi dari string di SQL Server 2008?

LTRIM(RTRIM(' a b ')) akan menghapus semua spasi di kanan dan kiri string, tetapi saya juga harus menghapus spasi di tengah.


5
Dengan "semua ruang putih" yang Anda maksud hanya ruang biasa? Atau, maksud Anda tab, CR, LF, dan karakter lain yang mungkin ditampilkan sebagai ruang putih?
Gordon Linoff

3
@GordonLinoff: Saya maksudkan ruang reguler
Ananth

Jawaban:


385

Cukup ganti saja;

SELECT REPLACE(fld_or_variable, ' ', '')

Sunting: Hanya untuk memperjelas; itu adalah pengganti global, tidak perlu trim()atau khawatir tentang beberapa ruang untuk salah satu charatau 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 

Hasil

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
Bagaimana jika ada beberapa spasi putih di antara kata-kata? REPLACE hanya menghapus satu per satu. Fungsi yang ditentukan pengguna harus ditulis yang menghilangkan banyak spasi.
Farhan

Ini sepertinya tidak menggantikan spasi putih
Ryan Sampson

7
Itu harus mengganti semua spasi putih di mana
Alex K.

Itu AKAN menghapus semua spasi putih kecuali untuk tertinggal. Untuk menghapus tambahan, tambahkan TRIM (REPLACE (fld_or_variable, '', '')). Alasan mengapa menghapus bahkan beberapa spasi adalah karena ... baik itu mengubah setiap karakter spasi menjadi tidak ada apakah ruang bersebelahan atau tidak.
snaplemouton

32
Ganti menghapus semua ruang bahkan mengekor satu. Jika masih ada spasi dalam data setelah ini selesai, kemungkinan itu bukan spasi tetapi karakter yang tidak diinginkan seperti tab atau pengembalian karraige.
HLGEM


28

Jika ini merupakan pembaruan di atas meja, Anda hanya perlu menjalankan pembaruan ini beberapa kali hingga memengaruhi 0 baris.

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


11

Referensi diambil dari blog ini:

Pertama, Buat tabel sampel dan data:

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

Script ke SELECT string tanpa Spaces Ekstra:

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

Hasil:

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
Apakah Anda menyadari OP ingin menghapus SEMUA spasi alih-alih mengganti beberapa spasi dengan satu spasi?
Kaii

3
Ini seharusnya diturunkan karena jawabannya tidak seperti yang disyaratkan oleh OP, tetapi malah mendapat 4 upvotes. Selamat datang di Stack Overflow.
Mr.J

@ Mr.J dan sekarang memiliki 9. Dunia gila.
Leszek P

11

100% berfungsi

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

Anda bisa menggunakan "column_name"ataucolumn_name

Terima kasih

Subroto


2
Saya harus menggunakan select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')untuk menghapus semua baris dan spasi baru dari varcharkolom. Jika saya menggunakan '\ n' dan '\ r' alih-alih char (13) dan char (10) tidak berfungsi.
Jan

untuk menjalankan ini, diperlukan untuk menjalankan "SET SQL_SAFE_UPDATES = 0;"
Shai Epstein


6

Jika ada beberapa spasi putih dalam sebuah string, maka ganti mungkin tidak berfungsi dengan benar. Untuk itu, fungsi berikut harus digunakan.

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

Contoh:

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

Keluaran:

aaaaaaaaaa

1
"@InputStr" harus "@ResultStr" di badan loop sementara.
jjoelson

@jjoelson, maukah Anda membuat fungsi ini dan mengujinya sebelum menunjukkan kesalahan?
Farhan

7
Maaf, saya sedang bekerja di bawah asumsi Anda di atas bahwa REPLACE hanya menghapus satu per satu, dalam hal ini fungsi ini akan menyebabkan loop tak terbatas untuk input dengan beberapa spasi. Pada kenyataannya, loop sementara bahkan tidak diperlukan sama sekali.
jjoelson

2
Farhan, jika REPLACE bekerja seperti yang Anda pikirkan maka komentar pertama @jjoelson benar. Kalau tidak, Anda akan memiliki loop tak terbatas karena InputStr tidak pernah berubah sehingga ResultStr akan selalu menjadi hasil REPLACE pertama. Alasan kode Anda bekerja adalah karena REPLACE hanya diperlukan 1 kali. Ini tidak pernah disebut yang kedua kalinya tidak peduli string apa yang Anda lemparkan padanya. Tambahkan penghitung dan cetak dengan setiap iterasi. Itu akan selalu 1. REPLACE (InputStr, '', '') akan menghapus setiap ruang dengan satu panggilan.
Gilbert

6

Ini melakukan trik menghilangkan spasi pada string:

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

2

Untuk berjaga-jaga jika Anda perlu TRIM spasi di semua kolom, Anda dapat menggunakan skrip ini untuk melakukannya secara dinamis:

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

jika Anda ingin menghapus spasi, -, dan teks lain dari string kemudian gunakan berikut ini:

misalkan Anda memiliki nomor ponsel di Tabel Anda seperti '718-378-4957' atau '7183784957' dan Anda ingin mengganti dan mendapatkan nomor ponsel kemudian gunakan Teks berikut.

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

Hasil: - 7183784957


2

Hanya tip, jika Anda mengalami masalah dengan fungsi ganti, Anda mungkin memiliki set data tipe ke nchar (dalam hal ini itu adalah panjang tetap dan tidak akan berfungsi).




2

ini berguna bagi saya:

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

Saya memiliki masalah ini hari ini dan ganti / trim lakukan triknya .. lihat di bawah.

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

sebelum dan sesudah :

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

1
Mengapa repot-repot dengan LTRIM& RTRIM?
BanksySan

Keren. Apakah Anda punya contoh?
BanksySan

0

Untuk menghapus spasi di string ke kiri dan ke kanan. Untuk menghapus ruang di tengah digunakan Replace.

Anda dapat menggunakan RTRIM()untuk menghapus spasi dari kanan dan LTRIM()untuk menghapus spasi dari kiri maka spasi kiri dan kanan dihapus sebagai berikut:

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

0

Sintaks untuk mengganti karakter tertentu:

REPLACE ( string_expression , string_pattern , string_replacement )  

Misalnya dalam string "HelloReplaceThingsGoing" Ganti kata digantikan oleh Bagaimana

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

0

Versi fungsional (udf) yang menghilangkan spasi, cr, lf, tab atau dapat dikonfigurasi.

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

Hasil: '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

Untuk beberapa alasan, penggantian hanya berfungsi dengan satu string setiap kali. Saya memiliki string seperti ini " Tes MSP " dan saya ingin hanya menyisakan satu ruang.

Saya menggunakan pendekatan yang @Farhan lakukan, tetapi dengan beberapa modifikasi:

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

Lalu saya menjalankan pembaruan saya seperti ini

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

Lalu saya mendapat hasil ini: Tes MSP

Posting di sini jika seandainya seseorang membutuhkannya seperti saya.

Berjalan di: Microsoft SQL Server 2016 (SP2)


0

Periksa dan Coba skrip di bawah ini (Unit Diuji) -

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

Tampaknya semua orang terus mengacu pada fungsi REPLACE tunggal. Atau bahkan banyak panggilan fungsi REPLACE. Tetapi ketika Anda memiliki output dinamis dengan jumlah ruang yang tidak diketahui, itu tidak akan berfungsi. Siapa pun yang berurusan dengan masalah ini secara teratur tahu bahwa REPLACE hanya akan menghapus satu ruang, BUKAN SEMUA, sebagaimana mestinya. Dan LTRIM dan RTRIM tampaknya memiliki masalah yang sama. Serahkan pada Microsoft. Berikut adalah contoh output yang menggunakan WHILE Loop untuk menghapus nilai ALL CHAR (32) (spasi).

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'

Inilah output dari kode di atas:

START:      C               A                         :END
START:CA:END

Sekarang untuk mengambil langkah lebih lanjut dan menggunakannya dalam pernyataan UPDATE atau SELECT, ubah ke 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

Kemudian gunakan fungsi dalam pernyataan SELECT atau 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 hanya akan menghapus satu ruang." ...Betulkah? Demo sederhana ini tidak menyarankan: dbfiddle.uk/… . Apakah Anda punya contoh di mana itu tidak akan berhasil?
ADyson
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.