465

TSQL 文字列の改行文字を置換 (または削除) したいと考えています。何か案は?

明らかなこと

REPLACE(@string, CHAR(13), '')

やらないだけ…

4

13 に答える 13

942

実際、SQL コマンドまたはスクリプト文字列の新しい行は、CR、LF、または CR+LF のいずれかになります。それらをすべて取得するには、次のようなものが必要です。

SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')
于 2009-06-04T16:41:04.240 に答える
154
REPLACE(@string, CHAR(13) + CHAR(10), '')
于 2009-06-04T16:13:25.373 に答える
46

私はパーティーに 1 年遅れているかもしれませんが、私は毎日クエリと MS-SQL に取り組んでおり、組み込み関数 LTRIM() と RTRIM() (そして常にそれらを一緒に呼び出さなければならない) にうんざりしていて、最後に改行がある「汚い」データをキャッチしないという問題があったため、より優れた TRIM 関数を実装する時期が来たと判断しました。仲間からのフィードバックを歓迎します!

免責事項:これは実際には空白の拡張形式(タブ、ラインフィード、キャリッジリターンなど)を削除(単一の空白に置き換え)するため、元の回答から「CleanAndTrim」に名前が変更されました。ここでの考え方は、文字列内にそのような特別な空白文字を必要としないため、それらが先頭/末尾にない場合は、プレーン スペースに置き換える必要があるということです。そのような文字を意図的に文字列 (たとえば、これを実行しようとしているデータの列) に格納した場合は、絶対に行わないでください。この関数を改善するか、「本体」からではなく、文字列の端点から文字通りこれらの文字を削除する独自の関数を作成してください。

さて、免責事項が更新されたので、これがコードです。

-- =============================================
-- Description: TRIMs a string 'for real' - removes standard whitespace from ends,
-- and replaces ASCII-char's 9-13, which are tab, line-feed, vert tab,
-- form-feed, & carriage-return (respectively), with a whitespace
-- (and then trims that off if it's still at the beginning or end, of course).
-- =============================================
CREATE FUNCTION [fn_CleanAndTrim] (
       @Str nvarchar(max)
)
RETURNS nvarchar(max) AS
BEGIN
       DECLARE @Result nvarchar(max)

       SET @Result = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
              LTRIM(RTRIM(@Str)), CHAR(9), ' '), CHAR(10), ' '), CHAR(11), ' '), CHAR(12), ' '), CHAR(13), ' ')))

       RETURN @Result
END

乾杯!

別の免責事項: 典型的な Windows の改行は CR+LF であるため、文字列にこれらが含まれている場合、それらを「二重」スペースに置き換えることになります。

UPDATE, 2016 : これらの特殊な空白文字を選択した他の文字に置き換えるオプションを提供する新しいバージョン! これには、Windows CR+LF ペアリングの解説と回避策も含まれます。つまり、特定の文字ペアを単一の置換に置き換えます。

IF OBJECT_ID('dbo.fn_CleanAndTrim') IS NULL
    EXEC ('CREATE FUNCTION dbo.fn_CleanAndTrim () RETURNS INT AS BEGIN RETURN 0 END')
GO
-- =============================================
-- Author: Nate Johnson
-- Source: http://stackoverflow.com/posts/24068265
-- Description: TRIMs a string 'for real' - removes standard whitespace from ends,
-- and replaces ASCII-char's 9-13, which are tab, line-feed, vert tab, form-feed,
-- & carriage-return (respectively), with a whitespace or specified character(s).
-- Option "@PurgeReplaceCharsAtEnds" determines whether or not to remove extra head/tail
-- replacement-chars from the string after doing the initial replacements.
-- This is only truly useful if you're replacing the special-chars with something
-- **OTHER** than a space, because plain LTRIM/RTRIM will have already removed those.
-- =============================================
ALTER FUNCTION dbo.[fn_CleanAndTrim] (
    @Str NVARCHAR(MAX)
    , @ReplaceTabWith NVARCHAR(5) = ' '
    , @ReplaceNewlineWith NVARCHAR(5) = ' '
    , @PurgeReplaceCharsAtEnds BIT = 1
)
RETURNS NVARCHAR(MAX) AS
BEGIN
    DECLARE @Result NVARCHAR(MAX)

    --The main work (trim & initial replacements)
    SET @Result = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        LTRIM(RTRIM(@Str))  --Basic trim
        , NCHAR(9), @ReplaceTabWith), NCHAR(11), @ReplaceTabWith)   --Replace tab & vertical-tab
        , (NCHAR(13) + NCHAR(10)), @ReplaceNewlineWith) --Replace "Windows" linebreak (CR+LF)
        , NCHAR(10), @ReplaceNewlineWith), NCHAR(12), @ReplaceNewlineWith), NCHAR(13), @ReplaceNewlineWith)))   --Replace other newlines

    --If asked to trim replacement-char's from the ends & they're not both whitespaces
    IF (@PurgeReplaceCharsAtEnds = 1 AND NOT (@ReplaceTabWith = N' ' AND @ReplaceNewlineWith = N' '))
    BEGIN
        --Purge from head of string (beginning)
        WHILE (LEFT(@Result, DATALENGTH(@ReplaceTabWith)/2) = @ReplaceTabWith)
            SET @Result = SUBSTRING(@Result, DATALENGTH(@ReplaceTabWith)/2 + 1, DATALENGTH(@Result)/2)

        WHILE (LEFT(@Result, DATALENGTH(@ReplaceNewlineWith)/2) = @ReplaceNewlineWith)
            SET @Result = SUBSTRING(@Result, DATALENGTH(@ReplaceNewlineWith)/2 + 1, DATALENGTH(@Result)/2)

        --Purge from tail of string (end)
        WHILE (RIGHT(@Result, DATALENGTH(@ReplaceTabWith)/2) = @ReplaceTabWith)
            SET @Result = SUBSTRING(@Result, 1, DATALENGTH(@Result)/2 - DATALENGTH(@ReplaceTabWith)/2)

        WHILE (RIGHT(@Result, DATALENGTH(@ReplaceNewlineWith)/2) = @ReplaceNewlineWith)
            SET @Result = SUBSTRING(@Result, 1, DATALENGTH(@Result)/2 - DATALENGTH(@ReplaceNewlineWith)/2)
    END

    RETURN @Result
END
GO
于 2014-06-05T19:06:50.187 に答える
34

T-SQL の改行は、CHAR(13) & CHAR(10) (キャリッジ リターン + ライン フィード) で表されます。したがって、改行を置き換えるテキストで REPLACE ステートメントを作成できます。

REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')
于 2009-06-04T16:17:14.263 に答える
26

ほとんどの人が望むことを行うには、実際の改行文字ではないプレースホルダーを作成します。次に、実際に次のアプローチを組み合わせることができます。

REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(10), 'something else')

この方法では、1 回だけ交換します。のアプローチ:

REPLACE(REPLACE(MyField, CHAR(13), ''), CHAR(10), '')

CRLF 文字を取り除きたいだけの場合はうまく機能しますが、次のようなプレースホルダーが必要な場合は

<br/>

または何か、最初のアプローチはもう少し正確です。

于 2013-07-08T20:16:24.380 に答える