Supprimer tous les espaces d'une chaîne dans SQL Server


222

Quelle est la meilleure façon de supprimer tous les espaces d'une chaîne dans SQL Server 2008?

LTRIM(RTRIM(' a b ')) supprimerait tous les espaces à droite et à gauche de la chaîne, mais je dois également supprimer l'espace au milieu.


5
Par "tous les espaces blancs", entendez-vous uniquement les espaces réguliers? Ou, voulez-vous dire des tabulations, CR, LF et d'autres caractères qui peuvent s'afficher en tant qu'espace blanc?
Gordon Linoff

3
@GordonLinoff: Je voulais dire des espaces réguliers
Ananth

Réponses:


385

Remplacez-le simplement;

SELECT REPLACE(fld_or_variable, ' ', '')

Edit: Juste pour clarifier; c'est un remplacement global, il n'y a pas besoin de trim()s'inquiéter de plusieurs espaces pour charou 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 

Résultat

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
Et s'il y a plusieurs espaces blancs entre les mots? REMPLACER n'en supprime qu'un à la fois. Une fonction définie par l'utilisateur doit être écrite pour supprimer plusieurs espaces.
Farhan

Cela ne semble pas remplacer les espaces blancs en fuite
Ryan Sampson

7
Il devrait remplacer tous les espaces partout
Alex K.

Il enlèvera tous les espaces blancs à l'exception de la fin. Pour supprimer la fin, ajoutez TRIM (REPLACE (fld_or_variable, '', '')). La raison pour laquelle il supprime même plusieurs espaces est parce que ... eh bien, il change tous les caractères d'espace en rien que les espaces soient côte à côte ou non.
snaplemouton du

32
Remplacer supprime tous les espaces, même à la fin. S'il reste encore des espaces dans les données après cela, il est probable qu'il ne s'agit pas d'espaces mais de caractères non imprimables comme des tabulations ou des retours carraige.
HLGEM


28

S'il s'agit d'une mise à jour sur une table, il vous suffit d'exécuter cette mise à jour plusieurs fois jusqu'à ce qu'elle affecte 0 lignes.

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


11

Référence tirée de ce blog:

Tout d'abord, créez un exemple de table et de données:

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 pour sélectionner une chaîne sans espaces supplémentaires:

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

Résultat:

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
Vous rendez-vous compte que l'OP voulait supprimer TOUS les espaces au lieu de remplacer plusieurs espaces par un seul?
Kaii

3
Cela aurait dû être rétrogradé car la réponse n'est pas celle requise par le PO, mais il a obtenu 4 votes positifs. Bienvenue dans Stack Overflow.
Mr.J

@ Mr.J et maintenant il en a 9. Monde fou.
Leszek P

11

100% de travail

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

Vous pouvez utiliser "column_name"oucolumn_name

Merci

Subroto


2
J'ai dû utiliser select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')pour supprimer tous les sauts de ligne et les espaces d'une varcharcolonne. Si j'ai utilisé '\ n' et '\ r' au lieu de char (13) et char (10) cela n'a pas fonctionné.
Jan

pour l'exécuter, il faut exécuter "SET SQL_SAFE_UPDATES = 0;"
Shai Epstein


6

S'il y a plusieurs espaces blancs dans une chaîne, le remplacement peut ne pas fonctionner correctement. Pour cela, la fonction suivante doit être utilisée.

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

Exemple:

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

Production:

aaaaaaaaaa

1
"@InputStr" doit être "@ResultStr" dans le corps de la boucle while.
jjoelson

@jjoelson voudriez-vous créer cette fonction et la tester avant de signaler des erreurs?
Farhan

7
Désolé, je travaillais sous votre hypothèse ci-dessus que REPLACE n'en supprime qu'une à la fois, auquel cas cette fonction provoquerait une boucle infinie pour les entrées avec plusieurs espaces. En réalité, la boucle while n'est même pas nécessaire du tout.
jjoelson

2
Farhan, si REPLACE a fonctionné comme vous le pensez, le premier commentaire de @ jjoelson est correct. Sinon, vous aurez une boucle infinie car InputStr ne change jamais, donc ResultStr sera toujours le premier résultat REPLACE. La raison pour laquelle votre code fonctionne est que REMPLACER n'est nécessaire qu'une seule fois. Il n'est jamais appelé une deuxième fois, quelle que soit la chaîne que vous lui lancez. Ajoutez un compteur et imprimez-le à chaque itération. Ce sera toujours 1. REPLACE (InputStr, '', '') supprimera chaque espace avec un seul appel.
Gilbert

6

Cela fait l'affaire de supprimer les espaces sur les chaînes:

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

2

Juste au cas où vous auriez besoin de TRIM espaces dans toutes les colonnes, vous pouvez utiliser ce script pour le faire dynamiquement:

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

si vous souhaitez supprimer des espaces, - et un autre texte de la chaîne, utilisez ce qui suit:

Supposons que vous ayez un numéro de mobile dans votre tableau comme '718-378-4957' ou '7183784957' et que vous souhaitiez remplacer et obtenir le numéro de mobile, puis utilisez le texte suivant.

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

Résultat: - 7183784957


2

Juste un conseil, au cas où vous rencontriez des problèmes avec la fonction de remplacement, vous pourriez avoir le type de données défini sur nchar (auquel cas il s'agit d'une longueur fixe et cela ne fonctionnera pas).


2


2

cela m'est utile:

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

J'ai eu ce problème aujourd'hui et remplacer / trim a fait l'affaire .. voir ci-dessous.

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

avant et après :

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

1
Pourquoi s'embêter avec le LTRIM& RTRIM?
BanksySan

Cool. Avez-vous l'exemple?
BanksySan

0

Pour supprimer les espaces dans une chaîne de gauche et de droite. Pour supprimer l'espace en utilisation moyenneReplace .

Vous pouvez utiliser RTRIM()pour supprimer les espaces de droite et LTRIM()pour supprimer les espaces de gauche, donc les espaces gauche et droit supprimés comme suit:

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

0

Syntaxe pour remplacer un caractère spécifique:

REPLACE ( string_expression , string_pattern , string_replacement )  

Par exemple, dans la chaîne "HelloReplaceThingsGoing" Remplacer le mot est remplacé par Comment

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

0

Une version fonctionnelle (udf) qui supprime les espaces, cr, lf, tabulations ou configurables.

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

Résultat: '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

Pour une raison quelconque, le remplacement ne fonctionne qu'avec une chaîne à chaque fois. J'avais une chaîne comme celle-ci " Test MSP " et je veux ne laisser qu'un seul espace.

J'ai utilisé l'approche de @Farhan, mais avec quelques modifications:

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

Ensuite, je lance ma mise à jour comme ça

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

Ensuite, j'ai obtenu ce résultat: Test MSP

Publier ici si au cas où quelqu'un en aurait besoin comme moi.

Fonctionnant sur: Microsoft SQL Server 2016 (SP2)


0

Vérifiez et essayez le script ci-dessous (Unit Tested) -

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

Il semble que tout le monde continue de se référer à une seule fonction REPLACE. Ou même de nombreux appels d'une fonction REMPLACER. Mais lorsque vous avez une sortie dynamique avec un nombre inconnu d'espaces, cela ne fonctionnera pas. Quiconque traite régulièrement ce problème sait que REPLACE ne supprimera qu'un seul espace, PAS TOUS, comme il se doit. Et LTRIM et RTRIM semblent avoir le même problème. Laissez-le à Microsoft. Voici un exemple de sortie qui utilise une boucle WHILE pour supprimer TOUTES les valeurs CHAR (32) (espace).

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'

Voici la sortie du code ci-dessus:

START:      C               A                         :END
START:CA:END

Maintenant, pour aller plus loin et l'utiliser dans une instruction UPDATE ou SELECT, changez-le en 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

Utilisez ensuite la fonction dans une instruction SELECT ou 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 ne supprimera qu'un seul espace." ...vraiment? Cette simple démonstration ne suggère pas: dbfiddle.uk/… . Avez-vous un exemple où cela ne fonctionnerait pas?
ADyson
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.