SQL Serverの文字列からすべてのスペースを削除する


222

SQL Server 2008で文字列からすべてのスペースを削除する最良の方法は何ですか?

LTRIM(RTRIM(' a b ')) 文字列の左右のスペースをすべて削除しますが、中央のスペースも削除する必要があります。


5
「すべての空白」とは、通常のスペースのみを意味しますか?または、タブ、CR、LF、および空白として表示される可能性のあるその他の文字を意味しますか?
ゴードンリノフ

3
@GordonLinoff:私は通常のスペースを意味しました
Ananth

回答:


385

単に交換してください。

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"

2
単語間に複数の空白がある場合はどうなりますか?REPLACEは一度に1つしか削除しません。複数のスペースを削除するユーザー定義関数を記述する必要があります。
ファルハン

これは末尾の空白を置き換えるものではないようです
Ryan Sampson

7
あらゆる場所のすべての空白を置き換える必要があります
Alex K.

末尾を除くすべての空白を削除します。末尾を削除するには、TRIM(REPLACE(fld_or_variable、 ''、 ''))を追加します。複数のスペースも削除するのは、スペースが隣り合っているかどうかに関係なく、すべてのスペース文字が何も変更されないためです。
snaplemouton 2013

32
Replaceは、末尾のスペースも含めてすべてのスペースを削除します。これが行われた後もデータにまだスペースが含まれている場合、それらはスペースではなく、タブや改行などの印刷できない文字である可能性があります。
HLGEM 2013


28

テーブルの更新の場合、影響がある行がなくなるまで、この更新を複数回実行するだけです。

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


11

このブログから引用したリファレンス:

最初に、サンプルテーブルとデータを作成します。

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

余分なスペースなしで文字列を選択するスクリプト:

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

2
OPが複数のスペースを1つのスペースで置き換えるのではなく、すべてのスペースを削除したいと思いましたか?
Kaii 2016

3
これは、OPが必要とする回答ではないため、反対票を投じられるべきでしたが、代わりに4票を得ました。Stack Overflowへようこそ。
Mr.J 2017年

@ Jr.Jと9クレイジーな世界。
Leszek P

11

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

ありがとう

サブロト


2
select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')からすべての改行とスペースを削除するために使用する必要がありましたvarchar。char(13)とchar(10)の代わりに '\ n'と '\ r'を使用した場合、機能しませんでした。

これを実行するには、「SET SQL_SAFE_UPDATES = 0;」を実行する必要があります。
Shai Epstein


6

文字列に複数の空白がある場合、replaceは正しく機能しない可能性があります。そのためには、次の関数を使用する必要があります。

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

1
「@InputStr」は、whileループの本体では「@ResultStr」でなければなりません。
jjoelson 2013年

@jjoelsonは、間違いを指摘する前に、この関数を作成してテストしますか?
Farhan

7
申し訳ありませんが、REPLACEは一度に1つしか削除しないという上記の仮定の下で作業していました。この場合、この関数は複数のスペースを持つ入力に対して無限ループを引き起こします。実際には、whileループはまったく必要ありません。
jjoelson

2
Farhanさん、REPLACEがあなたが思っているように機能した場合、@ jjoelsonの最初のコメントは正しいです。それ以外の場合、InputStrは変更されないため、ResultStrが常に最初のREPLACE結果になるため、無限ループが発生します。コードが機能する理由は、REPLACEが1回だけ必要なためです。どんな文字列を投げても、二度と呼ばれることはありません。カウンターを追加し、繰り返しごとに出力します。常に1になります。REPLACE(InputStr、 ''、 '')は、1回の呼び出しですべてのスペースを削除します。
ギルバート

6

これは文字列のスペースを削除するトリックを行います:

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

2

すべての列のスペースをトリムする必要がある場合に備えて、このスクリプトを使用して動的に行うことができます。

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

スペース、-、および別のテキストを文字列から削除する場合は、以下を使用します。

テーブルに「718-378-4957」または「7183784957」のような携帯電話番号があり、携帯電話番号を置き換えて取得したい場合は、次のテキストを使用します。

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

結果:-7183784957


2

ヒントにすぎません。replace関数で問題が発生した場合は、データ型をncharに設定している可能性があります(この場合、データ型は固定長であり、機能しません)。


2


2

これは私にとって便利です:

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

私は今日この問題を抱えていて、置換/トリムがトリックをしました..以下を参照してください。

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' 

1
LTRIM&に悩む理由はRTRIM
BanksySan 2016年

涼しい。例はありますか?
BanksySan 2016年

0

文字列の左右のスペースを削除します。中間使用時にスペースを削除するにはReplace

を使用RTRIM()して、右側からスペースを削除LTRIM()したり、左側からスペースを削除したりできるため、次のようにして削除された左側と右側のスペースを削除できます。

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

0

特定の文字を置き換えるための構文:

REPLACE ( string_expression , string_pattern , string_replacement )  

たとえば、「He​​lloReplaceThingsGoing」という文字列では、置換単語はHowに置き換えられます。

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

0

スペース、cr、lf、タブ、または構成可能変数を削除する機能バージョン(udf)。

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

0

何らかの理由で、置換は毎回1つの文字列でのみ機能します。この「Test MSP」のような文字列があり、スペースを1つだけ残したいと思います。

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


0

以下のスクリプトを確認して試してください(単体テスト済み)-

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

誰もが単一のREPLACE関数を参照し続けているようです。または、REPLACE関数の多くの呼び出しです。ただし、スペースの数が不明な動的出力がある場合、機能しません。この問題を定期的に処理する人なら誰でも、REPLACEがすべてではなく1つのスペースしか削除しないことを知っています。また、LTRIMとRTRIMには同じ問題があるようです。マイクロソフトにお任せください。以下は、WHILEループを使用してすべての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

1
「REPLACEは1つのスペースのみを削除します。」...本当に?この単純なデモは、次のことを示唆していません:dbfiddle.uk/…。それがうまくいかない例をお持ちですか?
ADyson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.