MySQLフィールドの先頭と末尾の空白を削除するにはどうすればよいですか?


134

2つのフィールド(国とISOコード)のテーブルがあります。

Table1

   field1 - e.g. 'Afghanistan' (without quotes)
   field2 - e.g. 'AF'(without quotes)

一部の行では、2番目のフィールドの最初と最後に空白があり、クエリに影響を与えています。

Table1

   field1 - e.g. 'Afghanistan' (without quotes) 
   field2 - e.g. ' AF' (without quotes but with that space in front)

(SQLで)テーブルを調べ、field2の空白を検索/置換する方法はありますか?


1
私の回答をコメントとして追加して、見やすくします。明確にするために、TRIMはデフォルトでスペースのみを削除します(すべての空白は削除しません)。これがドキュメントです:dev.mysql.com/doc/refman/5.0/en/…– mulya '26
02/26

回答:


270

あなたはTRIMを探しています。

UPDATE FOO set FIELD2 = TRIM(FIELD2);

19
注:これにより、通常のスペースのみが削除され、他の空白文字(タブ、改行など)は削除されません
TM。

30
はい、あなたは正しい@TMなので、使用する方が良いです:UPDATE FOO set FIELD2 = TRIM(Replace(Replace(Replace(FIplaceD2、 '\ t'、 '')、 '\ n'、 '')、 '\ r' 、 '')); など
Chris Sim

9
もちろん、@ ChrisSimのソリューションはコンテンツ内の改行とタブも置き換えますが、これはおそらくほとんどの人がTRIM関数に求めているものではありません!
JoLoCo 2018

41

私があなたの回答と他のリンクから作成した一般的な回答は私にとってはうまくいき、コメントでそれを書きました:

 UPDATE FOO set FIELD2 = TRIM(Replace(Replace(Replace(FIELD2,'\t',''),'\n',''),'\r',''));

なぜなら、trim()はすべての空白を削除するわけではないので、削除するよりも、必要なすべての空白を置き換えるほうがよいからです。

私が私の答えを共有するのを手伝ってくれることを願っています:)


7
これにより、すべてのタブ/改行が削除されます。TRIMは、文字列の両端の空白のみを削除する必要があります。
DisgruntledGoat 2014

1
この思考と改行文字を削除するのは良い考え、おかげで、魔法のように動作し、私はそれをupvotedている、この考え方@クリスSIMのbcoz
サンカー・ガネーシュ

25

このソリューションを使用する前に、ユースケースを理解してください。

選択クエリの実行中にトリムが機能しない

これは機能します

select replace(name , ' ','') from test;

これはしませんが

select trim(name) from test;

9
TRIM()SELECT声明の中で私にとってはうまくいきますが、なぜこの答えが多くの賛成票を獲得したのか、私は本当に興味があります。mysqlを使用していますか?どのバージョン?
ビリーノア2016年

1
先頭と末尾のスペースのみを削除するdev.mysql.com/doc/refman/5.7/en/string-functions.html
amitchhajer

11
ええ、この答えは間違っています。これはどうして50以上の賛成票を得たのですか?
Loko

5
これは間違っているだけでなく、危険です。それは誰かのデータをひどく歪めることができます。
一部の非記述子ユーザー

1
私は反対票を投じました。テストケース:SELECT CONCAT('"', TRIM(" hello world "), '"') AS `trimmed value` FROM DUAL必要な出力を提供します"hello world"。replaceバリアントは単語の区切りとしてスペースを危険に削除しますSELECT CONCAT('"', REPLACE(" hello world ", ' ', '')) AS `replaced value` FROM DUAL が、不要な出力を提供します"helloworld"
Piemol


11

現在の回答では、文字列の先頭と末尾から実際に空白を100%削除することはないようです。

他の記事で述べたように、デフォルトのTRIMスペースのみ削除-のフォームフィードなどではない、タブ、Aの組み合わせTRIM、他の空白文字を指定するのは、限られた改善などを提供することができますTRIM(BOTH '\r' FROM TRIM(BOTH '\n' FROM TRIM(BOTH '\f' FROM TRIM(BOTH '\t' FROM TRIM(txt)))))。しかし、このアプローチの問題は、特定の文字を1つしか指定できないことTRIMと、それらの文字が最初と最後から削除されることだけです。したがって、トリムされる文字列が\t \t \t \t(たとえば、代替のスペースとタブ文字)のようなものである場合、より多くTRIMのsが必要になります。一般的なケースでは、これは無期限に続く可能性があります。

軽量のソリューションの場合、文字列の最初と最後の文字をループすることで、ジョブを実行する簡単なユーザー定義関数(UDF)を記述できるはずです。しかし、私はそれをするつもりはありません... このブログの投稿で説明されているように、私はすでに仕事をすることができ、他の理由で役立つかもしれないかなり重い正規表現の置き換えを既に書いているので。

デモ

Rextesterオンラインデモ。特に、最後の行は、他のメソッドは失敗しているが、正規表現メソッドは成功していることを示しています。

機能

-- ------------------------------------------------------------------------------------
-- USAGE
-- ------------------------------------------------------------------------------------
-- SELECT reg_replace(<subject>,
--                    <pattern>,
--                    <replacement>,
--                    <greedy>,
--                    <minMatchLen>,
--                    <maxMatchLen>);
-- where:
-- <subject> is the string to look in for doing the replacements
-- <pattern> is the regular expression to match against
-- <replacement> is the replacement string
-- <greedy> is TRUE for greedy matching or FALSE for non-greedy matching
-- <minMatchLen> specifies the minimum match length
-- <maxMatchLen> specifies the maximum match length
-- (minMatchLen and maxMatchLen are used to improve efficiency but are
--  optional and can be set to 0 or NULL if not known/required)
-- Example:
-- SELECT reg_replace(txt, '^[Tt][^ ]* ', 'a', TRUE, 2, 0) FROM tbl;
DROP FUNCTION IF EXISTS reg_replace;
CREATE FUNCTION reg_replace(subject VARCHAR(21845), pattern VARCHAR(21845),
  replacement VARCHAR(21845), greedy BOOLEAN, minMatchLen INT, maxMatchLen INT)
RETURNS VARCHAR(21845) DETERMINISTIC BEGIN 
  DECLARE result, subStr, usePattern VARCHAR(21845); 
  DECLARE startPos, prevStartPos, startInc, len, lenInc INT;
  IF subject REGEXP pattern THEN
    SET result = '';
    -- Sanitize input parameter values
    SET minMatchLen = IF(minMatchLen < 1, 1, minMatchLen);
    SET maxMatchLen = IF(maxMatchLen < 1 OR maxMatchLen > CHAR_LENGTH(subject),
                         CHAR_LENGTH(subject), maxMatchLen);
    -- Set the pattern to use to match an entire string rather than part of a string
    SET usePattern = IF (LEFT(pattern, 1) = '^', pattern, CONCAT('^', pattern));
    SET usePattern = IF (RIGHT(pattern, 1) = '$', usePattern, CONCAT(usePattern, '$'));
    -- Set start position to 1 if pattern starts with ^ or doesn't end with $.
    IF LEFT(pattern, 1) = '^' OR RIGHT(pattern, 1) <> '$' THEN
      SET startPos = 1, startInc = 1;
    -- Otherwise (i.e. pattern ends with $ but doesn't start with ^): Set start position
    -- to the min or max match length from the end (depending on "greedy" flag).
    ELSEIF greedy THEN
      SET startPos = CHAR_LENGTH(subject) - maxMatchLen + 1, startInc = 1;
    ELSE
      SET startPos = CHAR_LENGTH(subject) - minMatchLen + 1, startInc = -1;
    END IF;
    WHILE startPos >= 1 AND startPos <= CHAR_LENGTH(subject)
      AND startPos + minMatchLen - 1 <= CHAR_LENGTH(subject)
      AND !(LEFT(pattern, 1) = '^' AND startPos <> 1)
      AND !(RIGHT(pattern, 1) = '$'
            AND startPos + maxMatchLen - 1 < CHAR_LENGTH(subject)) DO
      -- Set start length to maximum if matching greedily or pattern ends with $.
      -- Otherwise set starting length to the minimum match length.
      IF greedy OR RIGHT(pattern, 1) = '$' THEN
        SET len = LEAST(CHAR_LENGTH(subject) - startPos + 1, maxMatchLen), lenInc = -1;
      ELSE
        SET len = minMatchLen, lenInc = 1;
      END IF;
      SET prevStartPos = startPos;
      lenLoop: WHILE len >= 1 AND len <= maxMatchLen
                 AND startPos + len - 1 <= CHAR_LENGTH(subject)
                 AND !(RIGHT(pattern, 1) = '$' 
                       AND startPos + len - 1 <> CHAR_LENGTH(subject)) DO
        SET subStr = SUBSTRING(subject, startPos, len);
        IF subStr REGEXP usePattern THEN
          SET result = IF(startInc = 1,
                          CONCAT(result, replacement), CONCAT(replacement, result));
          SET startPos = startPos + startInc * len;
          LEAVE lenLoop;
        END IF;
        SET len = len + lenInc;
      END WHILE;
      IF (startPos = prevStartPos) THEN
        SET result = IF(startInc = 1, CONCAT(result, SUBSTRING(subject, startPos, 1)),
                        CONCAT(SUBSTRING(subject, startPos, 1), result));
        SET startPos = startPos + startInc;
      END IF;
    END WHILE;
    IF startInc = 1 AND startPos <= CHAR_LENGTH(subject) THEN
      SET result = CONCAT(result, RIGHT(subject, CHAR_LENGTH(subject) + 1 - startPos));
    ELSEIF startInc = -1 AND startPos >= 1 THEN
      SET result = CONCAT(LEFT(subject, startPos), result);
    END IF;
  ELSE
    SET result = subject;
  END IF;
  RETURN result;
END;

DROP FUNCTION IF EXISTS format_result;
CREATE FUNCTION format_result(result VARCHAR(21845))
RETURNS VARCHAR(21845) DETERMINISTIC BEGIN
  RETURN CONCAT(CONCAT('|', REPLACE(REPLACE(REPLACE(REPLACE(result, '\t', '\\t'), CHAR(12), '\\f'), '\r', '\\r'), '\n', '\\n')), '|');
END;

DROP TABLE IF EXISTS tbl;
CREATE TABLE tbl
AS
SELECT 'Afghanistan' AS txt
UNION ALL
SELECT ' AF' AS txt
UNION ALL
SELECT ' Cayman Islands  ' AS txt
UNION ALL
SELECT CONCAT(CONCAT(CONCAT('\t \t ', CHAR(12)), ' \r\n\t British Virgin Islands \t \t  ', CHAR(12)), ' \r\n') AS txt;     

SELECT format_result(txt) AS txt,
       format_result(TRIM(txt)) AS trim,
       format_result(TRIM(BOTH '\r' FROM TRIM(BOTH '\n' FROM TRIM(BOTH '\f' FROM TRIM(BOTH '\t' FROM TRIM(txt))))))
         AS `trim spaces, tabs, formfeeds and line endings`,
       format_result(reg_replace(reg_replace(txt, '^[[:space:]]+', '', TRUE, 1, 0), '[[:space:]]+$', '', TRUE, 1, 0))
         AS `reg_replace`
FROM tbl;

使用法:

SELECT reg_replace(
         reg_replace(txt,
                     '^[[:space:]]+',
                     '',
                     TRUE,
                     1,
                     0),
         '[[:space:]]+$',
         '',
         TRUE,
         1,
         0) AS `trimmed txt`
FROM tbl;

4

このステートメントは、データベースのフィールドコンテンツを削除および更新します

フィールド値の左側の空白を削除するには

UPDATEテーブルSET field1 = LTRIM(field1);

例。UPDATEメンバーSET firstName = LTRIM(firstName);

フィールド値の右側の空白を削除するには

UPDATEテーブルSETfield1 = RTRIM(field1);

例。UPDATEメンバーSET firstName = RTRIM(firstName);


2

姓と名が含まれる主キー列の値をトリミングする必要があったため、姓と名の間のスペースを削除する必要があるため、すべての空白をトリミングしたくありませんでした。私のために働いたのは...

UPDATE `TABLE` SET `FIELD`= TRIM(FIELD);

または

UPDATE 'TABLE' SET 'FIELD' = RTRIM(FIELD);

または

UPDATE 'TABLE' SET 'FIELD' = LTRIM(FIELD);

FIELDの最初のインスタンスは単一引用符で囲まれていますが、2番目のインスタンスは引用符で囲まれていないことに注意してください。私はこの方法でそれを行わなければなりませんでした。


1

選択クエリでトリムを使用する必要がある場合は、正規表現も使用できます

SELECT * FROM table_name WHERE field RLIKE ' * query-string *'

'query-string'のようなフィールドを持つ行を返します


0

ltrimまたはrtrimを使用して、右側、左側、または文字列の空白を削除できます。



-5

私はそれがすでに受け入れられていることを知っていますが、「文字列の最初と最後だけでなく」「すべての空白を削除」を探す私のような人のために:

select SUBSTRING_INDEX('1234 243', ' ', 1);
// returns '1234'

編集2019/6/20:ああ、それは良くない。この関数は、「最初に文字スペースが発生したとき」以降の文字列の一部を返します。したがって、これを言うと、先頭と末尾の空白が削除され、最初の単語が返されると思います。

select SUBSTRING_INDEX(TRIM(' 1234 243'), ' ', 1);

5
これはOPとは関係ありません。
mickmackusa 14年

4
おっと、すべての空白を削除するのではなく、最初のスペースからすべてを削除します
Timo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.