web-dev-qa-db-fra.com

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

Quel est le meilleur moyen de supprimer tous les espaces d'une chaîne dans SQL Server 2008?

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

173
Ananth

Il suffit de le remplacer;

SELECT REPLACE(fld_or_variable, ' ', '')

Edit: .__ Juste pour clarifier; C'est un remplacement global, il n'est pas nécessaire de trim() ou de s'inquiéter de plusieurs espaces pour char ou 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"
301
Alex K.

Je voudrais utiliser un remplacement

select REPLACE (' Hello , How Are You ?', ' ', '' )

REMPLACE

30
Eduardo Crimi

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

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

REPLACE() function :

REPLACE(field, ' ', '')
11
Kaii

Référence extraite de ce blog:

Premièrement, 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
9
Anvesh

t-sql remplace http://msdn.Microsoft.com/en-us/library/ms186862.aspx

remplacer (val, '', '')

7
marko

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" ou column_name

Merci

Subroto

5
Subroto Biswas

S'il existe plusieurs espaces dans une chaîne, remplacez peut ne pas fonctionner correctement. Pour cela, la fonction suivante devrait ê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')

Sortie:

aaaaaaaaaa
4
Farhan

Cela fait le tour de supprimer les espaces sur les chaînes:

UPDATE
    tablename
SET
    columnname = replace(columnname, ' ', '');
3
Mario Rojas

Si vous rencontrez des problèmes avec la fonction de remplacement, vous pouvez définir le type de données sur nchar (dans ce cas, il s'agit d'une longueur fixe qui ne fonctionnera pas).

2
starbyone

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

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

Pour que toutes les réponses ci-dessus soient complètes, StackOverflow contient des articles supplémentaires sur la gestion de TOUS les caractères d'espacement (voir https://en.wikipedia.org/wiki/Whitespace_character pour obtenir la liste complète de ces caractères) :

2
ZJA

si vous souhaitez supprimer des espaces, -, et un autre texte de chaîne, utilisez la commande suivante:

supposons que vous ayez dans votre table un numéro de téléphone portable du type '718-378-4957' ou '7183784957' et vous souhaitez remplacer et obtenir le numéro de téléphone portable, puis utilisez le texte suivant.

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

Résultat: - 7183784957

2
Jeetendra Negi

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 REPLACE. Mais lorsque vous avez une sortie dynamique avec un nombre inconnu d'espaces, cela ne fonctionnera pas. Quiconque s’occupe régulièrement de ce problème sait que REPLACE ne supprimera qu’un seul espace, PAS TOUT, comme il se doit. Et LTRIM et RTRIM semblent avoir le même problème. Laissez-le à Microsoft. Voici un exemple de sortie utilisant une boucle WHILE pour supprimer les valeurs ALL 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

Puis utilisez 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
Tim

J'ai eu ce problème aujourd'hui et remplacer/trim fait le truc .. 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
zee

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

.

0
Checho Man

replace (replace (nom_colonne, CHAR (13), ''), CHAR (10), '')

0
Abdullah Yousuf

Pour une raison quelconque, le remplacement ne fonctionne qu'avec une chaîne à la fois . J'avais une chaîne comme celle-ci " Test MSP " et je ne voulais 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

Puis je lance ma mise à jour comme ça

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

Puis j'ai eu ce résultat: Test MSP

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

En cours d'exécution sur: Microsoft SQL Server 2016 (SP2)

0
Rogerio Honorio

Syntaxe de remplacement d'un caractère spécifique:

REPLACE ( string_expression , string_pattern , string_replacement )  

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

SELECT REPLACE('HelloReplaceThingsGoing','Replace','How');
GO
0
Subash J

Pour supprimer les espaces d'une chaîne à gauche et à droite. Pour supprimer de l’espace en utilisation moyenne Replace.

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

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

Une version fonctionnelle (udf) qui supprime les espaces, cr, lf, tabs ou configurable.

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
crokusek