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.
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.
Yanıtlar:
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 char
ya 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"
REPLACE(field, ' ', '')
İ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
% 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
select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')
Bir varchar
sü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ı.
t-sql yerine http://msdn.microsoft.com/en-us/library/ms186862.aspx
değiştirin (val, '', '')
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
Bu, dizelerdeki boşlukları kaldırma hile yapar:
UPDATE
tablename
SET
columnname = replace(columnname, ' ', '');
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
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
Yukarıdaki tüm cevapları tamamlamak için StackOverflow'da TÜM boşluk karakterleriyle nasıl başa çıkılacağı ile ilgili ek yayınlar var (bu karakterlerin tam listesi için bkz. Https://en.wikipedia.org/wiki/Whitespace_character ):
((Sütun_ismi, CHAR (13), ''), CHAR (10), '' yerine) yerine
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
.
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'
LTRIM
& ile uğraşıyorsunuz RTRIM
?
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"))
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
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)
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;
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