Bir MySQL alanında baştaki ve sondaki boşluk nasıl kaldırılır?


134

İki alan içeren bir tablom var (ülkeler ve ISO kodları):

Table1

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

Bazı satırlarda, ikinci alanın başında ve / veya sonunda, sorguları etkileyen boşluk vardır.

Table1

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

Tablodan geçip alan2'deki beyaz boşluğu bulmanın / değiştirmenin bir yolu (SQL'de) var mı?


1
Cevabımı daha görünür kılmak için yorum olarak eklemek: Sadece açık olmak gerekirse, TRIM varsayılan olarak yalnızca boşlukları kaldırır (tüm boşlukları değil). İşte belge: dev.mysql.com/doc/refman/5.0/en/…
mulya

Yanıtlar:


271

TRIM'i arıyorsunuz .

UPDATE FOO set FIELD2 = TRIM(FIELD2);

19
Not: bu yalnızca normal boşlukları kaldırır ve diğer boşluk karakterlerini (sekme, satırsonu, vb.)
TM.

30
evet haklısın @TM, bu yüzden kullanmak daha iyi: GÜNCELLEME FOO ayarla FIELD2 = TRIM (Değiştir (Değiştir (Değiştir (FIELD2, '\ t', ''), '\ n', ''), '\ r' , '')); vb.
Chris Sim

9
@ ChrisSim'in çözümü içeriğin İÇİNDEKİ satır başlarının ve sekmelerin yerini alacak olsa da, bu muhtemelen çoğu insanın bir TRIM işlevinden istediği şey değildir!
JoLoCo

41

Cevaplarınızdan ve diğer bağlantılardan oluşturduğum ve benim için işe yarayan ve bir yorumda yazdığım genel bir cevap:

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

vb.

Trim () tüm beyaz boşlukları kaldırmadığından, istediğiniz tüm beyaz boşlukları değiştirmek ve onu kırpmaktan daha iyidir.

Umarım cevabımı paylaşmanıza yardımcı olabilirim :)


7
Bu, tüm sekmeleri / yeni satırları kaldırır. TRIM, dizenin her iki ucundaki beyaz boşlukları kaldırmalıdır.
DisgruntledGoat

1
bu yeni çizgi karakterlerini düşünmek ve kaldırmak için iyi bir fikir, teşekkürler, Bir cazibe gibi çalışıyor, onu destekledim, bu düşünce için bcoz @Chris Sim
Sankar Ganesh

25

Lütfen bu çözümü kullanmadan önce kullanım durumunu anlayın:

seçme sorgusu yapılırken kırpma çalışmıyor

Bu çalışıyor

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

Bu olmazken

select trim(name) from test;

9
TRIM()bir SELECTaçıklamada benim için iyi çalışıyor , bu cevabın neden bu kadar çok olumlu oy aldığını gerçekten merak ediyorum. Mysql kullanıyor musunuz? Hangi versiyon?
billynoah

1

11
Evet bu cevap yanlış. Bu nasıl 50'den fazla olumlu oy aldı?
Loko

5
Bu sadece yanlış değil, tehlikeli. Birisinin verilerini ciddi şekilde bozabilir.
bazı tanımlayıcı olmayan kullanıcılar

1
Olumsuz oy verdim. Test çantası: SELECT CONCAT('"', TRIM(" hello world "), '"') AS `trimmed value` FROM DUAListenen çıktıyı verir "hello world". Değiştirme değişkeni, boşluğu sözcük ayırıcı olarak tehlikeli bir şekilde kaldırırken: SELECT CONCAT('"', REPLACE(" hello world ", ' ', '')) AS `replaced value` FROM DUAL istenmeyen çıktı verir"helloworld"
Piemol


11

Görünüşe göre mevcut cevapların hiçbiri bir dizenin başından ve sonundan beyaz boşlukların% 100'ünü gerçekten kaldırmayacak.

Diğer gönderilerde belirtildiği gibi, varsayılan TRIMyalnızca boşlukları kaldırır - sekmeleri, form beslemelerini vb. Kaldırmaz. TRIMDiğer boşluk karakterlerini belirten bir 'ler kombinasyonu, örneğin sınırlı bir gelişme sağlayabilir TRIM(BOTH '\r' FROM TRIM(BOTH '\n' FROM TRIM(BOTH '\f' FROM TRIM(BOTH '\t' FROM TRIM(txt))))). Ancak bu yaklaşımla ilgili sorun, belirli bir TRIMkarakter için yalnızca tek bir karakterin belirtilebilmesi ve bu karakterlerin yalnızca başından ve sonundan kaldırılmasıdır. Dolayısıyla, kırpılan dizge buna benzer bir şeyse \t \t \t \t(yani alternatif boşluklar ve sekme karakterleri), daha fazla TRIMs gerekli olacaktır - ve genel durumda bu sonsuza kadar sürebilir.

Hafif bir çözüm için, bir dizenin başındaki ve sonundaki karakterler arasında döngü oluşturarak işi yapmak için basit bir Kullanıcı Tanımlı İşlev (UDF) yazmak mümkün olmalıdır. Ama bunu yapmayacağım ... Zaten işi de yapabilen daha ağır bir düzenli ifade ikame edicisi yazdığım için - ve bu blog yazısında anlatıldığı gibi başka nedenlerle faydalı olabilir .

gösteri

Rextester çevrimiçi demosu . Özellikle, son satır diğer yöntemlerin başarısız olduğunu, ancak normal ifade yönteminin başarılı olduğunu gösterir.

İşlev :

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

Kullanımı:

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

4

Bu ifade, veritabanınızın alan içeriğini kaldıracak ve güncelleyecektir.

Alan değerinin sol tarafındaki beyaz boşlukları kaldırmak için

GÜNCELLEME tablo SET alanı1 = LTRIM (alan1);

ex. UPDATE üye SET firstName = LTRIM (firstName);

Alan değerinin sağ tarafındaki beyaz boşlukları kaldırmak için

UPDATE tablosu SETfield1 = RTRIM (alan1);

ex. UPDATE üye SET firstName = RTRIM (firstName);


2

Değerleri, adı ve soyadı olan bir birincil anahtar sütunundaki kırpmam gerekiyordu, bu yüzden tüm beyaz boşlukları kırpmak istemedim, çünkü bu, tutmam gereken ad ve soyad arasındaki boşluğu kaldıracaktı. Benim için işe yarayan şey ...

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

veya

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

veya

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

FIELD'in ilk örneğinin tek tırnak içinde olduğuna, ancak ikincinin hiç tırnak içinde olmadığına dikkat edin. Bunu bu şekilde yapmak zorunda kaldım ya da tırnak içinde her ikisine de sahip olduğumda bunun yinelenen bir birincil anahtar olduğunu söyleyen bir sözdizimi hatası verdi.


1

Seçme sorgusunda kırpma kullanmanız gerekiyorsa, normal ifadeler de kullanabilirsiniz.

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

'sorgu dizesi' gibi alan içeren satırları döndür


0

sağ veya sol veya bir dizi için beyaz boşlukları temizlemek için ltrim veya rtrim kullanabilirsiniz.


0

Aşağıdaki sql'yi kullanabilirsiniz, UPDATE TABLESET Column= replace (Column, '', '')


-5

Bunun zaten kabul edildiğini biliyorum, ancak benim gibi "TÜM boşlukları kaldır" (yalnızca dizenin başında ve sonunda değil) arayanlar için:

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

2019/6/20 DÜZENLEME: Evet, bu iyi değil. İşlev, "karakter alanı ilk kez ortaya çıktığında" beri dizenin bir kısmını döndürür. Öyleyse, bunu söylemek baştaki ve sondaki beyaz boşlukları kaldırıp ilk kelimeyi döndürdüğünü tahmin ediyorum:

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

5
Bunun OP ile hiçbir ilgisi yoktur.
mickmackusa

4
Whoah, tüm boşlukları kaldırmıyorsun - her şeyi ilk boşluktan itibaren kaldırıyorsun .
Timo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.