Каков наилучший способ удалить все пробелы из строки в SQL Server 2008?
LTRIM(RTRIM(' ab '))
удалит все пробелы справа и слева от строки, но мне также нужно удалить пробел в середине.
Каков наилучший способ удалить все пробелы из строки в SQL Server 2008?
LTRIM(RTRIM(' ab '))
удалит все пробелы справа и слева от строки, но мне также нужно удалить пробел в середине.
Просто замените его;
SELECT REPLACE(fld_or_variable, ' ', '')
Изменить: просто чтобы уточнить; это глобальная замена, нет необходимости в trim()
или беспокоиться о нескольких пробелах для char
или 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
Результат
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
select REPLACE (' Hello , How Are You ?', ' ', '' )
Если это обновление в таблице, все, что вам нужно сделать, это запустить это обновление несколько раз, пока оно не повлияет на 0 строк.
update tableName
set colName = REPLACE(LTRIM(RTRIM(colName)), ' ', ' ')
where colName like '% %'
REPLACE(field, ' ', '')
Ссылка, взятая из этого блога:
Сначала создайте образец таблицы и данных:
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 для выбора строки без дополнительных пробелов:
SELECT
[Rno]
,[Name] AS StringWithSpace
,LTRIM(RTRIM(REPLACE(REPLACE(REPLACE([Name],CHAR(32),'()'),')(',''),'()',CHAR(32)))) AS StringWithoutSpace
FROM tbl_RemoveExtraSpaces
Результат:
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 заменить http://msdn.microsoft.com/en-us/library/ms186862.aspx
replace (val, '', '')
100% работает
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
Вы можете использовать "column_name"
или column_name
Спасибо
Subroto
Если в строке есть несколько пробелов, замена может работать неправильно. Для этого следует использовать следующую функцию.
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
Пример:
select dbo.RemoveAllSpaces('aa aaa aa aa a')
Вывод:
aaaaaaaaaa
Это позволяет избавиться от пробелов в строках:
UPDATE
tablename
SET
columnname = replace(columnname, ' ', '');
На всякий случай, если вам нужны пробелы TRIM во всех столбцах, вы можете использовать этот script, чтобы сделать это динамически:
--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 + ']))'[email protected]
FROM #tempcols
where id = @i
select @i = @i+1
END
--execute the entire query
EXEC sp_executesql @trimmer
drop table #tempcols
если вы хотите удалить пробелы, - и другой текст из строки, используйте следующее:
предположим, что у вас есть номер мобильного телефона в вашей таблице, например "718-378-4957" или "7183784957", и вы хотите заменить и получить номер мобильного телефона, а затем использовать следующий текст.
select replace(replace(replace(replace(MobileNo,'-',''),'(',''),')',''),' ','') from EmployeeContactNumber
Результат: - 7183784957
Просто подсказка, если у вас возникли проблемы с функцией замены, у вас может быть установлен тип данных в nchar (в этом случае это фиксированная длина, и это не сработает).
Чтобы сделать все ответы выше, есть дополнительные сообщения в StackOverflow о том, как обращаться со ВСЕМИ пробельными символами (см. https://en.wikipedia.org/wiki/Whitespace_character для полного списка этих символов):
У меня была эта проблема сегодня, и замена/отделка сделала трюк... ниже.
update table_foo
set column_bar = REPLACE(LTRIM(RTRIM(column_bar)), ' ', '')
до и после:
old-bad: column_bar | New-fixed: column_bar
' xyz ' | 'xyz'
' xyz ' | 'xyz'
' xyz ' | 'xyz'
' xyz ' | 'xyz'
' xyz ' | 'xyz'
' xyz ' | 'xyz'
Replace (заменить (column_name, CHAR (13), ''), CHAR (10), '')
Кажется, что все продолжают ссылаться на одну функцию REPLACE. Или даже много вызовов функции ЗАМЕНА. Но когда у вас есть динамический вывод с неизвестным количеством пробелов, это не сработает. Любой, кто занимается этой проблемой на регулярной основе, знает, что REPLACE удалит только один пробел, а НЕ ВСЕ, как и должно быть. И LTRIM и RTRIM, кажется, имеют ту же проблему. Оставьте это Microsoft. Вот пример вывода, который использует цикл WHILE для удаления значений ALL CHAR (32) (пробел).
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'
Вот вывод приведенного выше кода:
START: C A :END
START:CA:END
Теперь, чтобы продвинуться дальше и использовать его в выражении UPDATE или SELECT, измените его на 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
Затем используйте функцию в операторе SELECT или 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
Чтобы удалить пробелы в строке слева и справа. Чтобы удалить пространство в среднем использовании Replace
.
Вы можете использовать RTRIM()
для удаления пробелов справа и LTRIM()
, чтобы удалить пробелы слева, поэтому левое и правое пространства удалены следующим образом:
SELECT * FROM table WHERE LTRIM(RTRIM(username)) = LTRIM(RTRIM("Bob alias baby"))
это полезно для меня:
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 ( string_expression , string_pattern , string_replacement )
Например, в строке "HelloReplaceThingsGoing" слово "Заменить" заменяется на "Как"
SELECT REPLACE('HelloReplaceThingsGoing','Replace','How');
GO
Функциональная версия (udf), которая удаляет пробелы, cr, lf, табуляции или настраивается.
select Common.ufn_RemoveWhitespace(' 234 asdf wefwef 3 x ', default) as S
Результат: '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
По некоторым причинам замена работает только с одной строкой каждый раз. У меня была строка типа " Тест MSP ", и я хочу оставить только один пробел.
Я использовал подход @Farhan, но с некоторыми изменениями:
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
Затем я запускаю свое обновление, как это
UPDATE tbTest SET Description = dbo.ReplaceAll(Description, ' ', ' ') WHERE ID = 14225
Тогда я получил такой результат: Тест MSP
Публикуйте здесь, если кому-то это нужно, как я.
Работает на: Microsoft SQL Server 2016 (SP2)
так что я просто боролся с этим и понял, что, пока у вас есть более двух "%" и пробел, отделяющий одного из них от прикосновения к другим, он будет работать... но не больше одного пробела, и он перестает работать
ВЫБЕРИТЕ имя НЕ НРАВИТСЯ '% (SPACE) %%'//ИЛИ//ВЫБЕРИТЕ имя НЕ НРАВИТСЯ '%% (ПРОБЕЛ)%'