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.
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"
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 '% %'
REPLACE(field, ' ', '')
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
t-sql remplace http://msdn.Microsoft.com/en-us/library/ms186862.aspx
remplacer (val, '', '')
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
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
Cela fait le tour de supprimer les espaces sur les chaînes:
UPDATE
tablename
SET
columnname = replace(columnname, ' ', '');
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).
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
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) :
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
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
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'
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
.
replace (replace (nom_colonne, CHAR (13), ''), CHAR (10), '')
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)
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
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"))
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