programing

MySQL 필드에서 선행 및 후행 공백을 제거하려면 어떻게 해야 합니까?

randomtip 2022. 10. 3. 22:18
반응형

MySQL 필드에서 선행 및 후행 공백을 제거하려면 어떻게 해야 합니까?

다음 두 개의 필드(국가 및 ISO 코드)가 있는 테이블이 있습니다.

Table1

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

일부 행에서는 두 번째 필드의 시작 및/또는 끝에 공백이 있으므로 쿼리에 영향을 미칩니다.

Table1

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

(SQL에서) 표를 검토하여 필드2의 공백을 찾거나 바꿀 수 있는 방법이 있습니까?

TRIM을 찾고 있습니다.

UPDATE FOO set FIELD2 = TRIM(FIELD2);

TRIM은 여러 유형의 공백을 지원할 수 있지만 한 번에 하나씩만 지원하므로 기본적으로 공간을 사용합니다.둥지, 둥지, 둥지, 둥지, 둥지, 둥지, 둥지, 둥지, 둥지, 둥지.TRIMs.

 TRIM(BOTH ' ' FROM TRIM(BOTH '\n' FROM column))

한 번에 모든 공백을 제거하고 싶다면REGEXP_REPLACE [[:space:]]의 예를 에 나타냅니다.하다

SELECT 
    -- using concat to show that the whitespace is actually removed.
    CONCAT(
         '+', 
         REGEXP_REPLACE(
             '    ha ppy    ', 
             -- This regexp matches 1 or more spaces at the beginning with ^[[:space:]]+
             -- And 1 or more spaces at the end with [[:space:]]+$
             -- By grouping them with `()` and splitting them with the `|`
             -- we match all of the expected values.
             '(^[[:space:]]+|[[:space:]]+$)', 

             -- Replace the above with nothing
             ''
         ), 
         '+') 
    as my_example;
-- outputs +ha ppy+

당신의 답변과 다른 링크에서 작성한 일반적인 답변은 다음과 같습니다.

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

기타.

trim()이 모든 공백을 제거하는 것은 아니기 때문에 원하는 모든 공백을 교체하는 것이 좋습니다.

제 답변을 공유하는데 도움이 되었으면 합니다:)

확실히 하기 위해 TRIM은 기본적으로 공백만 제거합니다(모든 공백은 아님).다음 문서를 참조해 주십시오.http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_trim

이 솔루션을 사용하기 전에 사용 사례를 이해하십시오.

선택 쿼리를 수행하는 동안 트림이 작동하지 않음

이것은 동작합니다.

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

이것은 그렇지 않지만

select trim(name) from test;

현재 답변 중 문자열의 시작과 끝에서 공백이 100% 제거되지 않는 답변은 없습니다.

다른 투고에서 설명한 바와 같이 기본값은 탭이나 폼피드 등이 아닌 공백만 삭제합니다.의 조합TRIM 다른 될 수 s 른 、 른 、 s 、 s s음음음음음음음 s s s s s s s s s s s s s s ) 。 TRIM(BOTH '\r' FROM TRIM(BOTH '\n' FROM TRIM(BOTH '\f' FROM TRIM(BOTH '\t' FROM TRIM(txt))))) 이 ,, 이1 는1 는는는 는는는는는 는는는는 는는는는는 는는는는는 can can can can can can can 할 수 TRIM그리고 그 캐릭터들은 처음과 끝부분에서만 지워집니다.그래서 만약 줄이 잘려나간다면\t \t \t \t과 탭 (예: 공백과 탭 문자), (예: 공백과 탭 문자)TRIMs가 필요하며, 일반적인 경우 이 상태가 무기한으로 지속될 수 있습니다.

경량 솔루션의 경우 문자열의 시작과 끝에 있는 문자를 루프하여 작업을 수행하는 간단한 User Defined Function(UDF; 사용자 정의 함수)을 작성할 수 있습니다.하지만 난 그렇게 하지 않을 거야...블로그 투고에 기재되어 있듯이, 나는 이미 보다 무거운 정규 표현 리페이서를 썼기 때문에, 이 일을 할 수도 있고, 다른 이유로도 도움이 될 수 있습니다.

데모

렉스터 온라인 데모특히 마지막 행은 다른 메서드는 실패했지만 정규 표현 메서드는 성공했음을 나타냅니다.

기능:

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

이 문은 데이터베이스의 필드 내용을 제거하고 업데이트합니다.

필드 값 왼쪽에 있는 공백을 제거하려면

UPDATE 테이블 SET 필드1 = LTRIM(필드1);

예: UPDATE 멤버 SET firstName = LTRIM(firstName);

필드 값의 오른쪽에서 공백을 제거하려면

UPDATE 테이블 SETfield1 = RTRIM(필드1);

예: UPDATE 멤버 SET firstName = RTRIM(firstName);

이름과 성이 있는 기본 키 열의 값을 잘라내야 했기 때문에 이름과 성 사이의 공백을 없애기 위해 공백 공간을 모두 잘라내고 싶지 않았습니다.나한테 효과가 있었던 건...

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

또는

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

또는

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

FILD의 첫 번째 인스턴스는 작은 따옴표로 둘러싸여 있지만 두 번째 인스턴스는 따옴표로 둘러싸여 있지 않습니다.이렇게 하지 않으면 둘 다 따옴표로 묶었을 때 중복된 프라이머리 키라는 구문 오류가 발생했습니다.

선택 쿼리에서 트림을 사용해야 하는 경우 정규 표현식도 사용할 수 있습니다.

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

query-string과 같은 필드가 있는 행을 반환합니다.

ltrim 또는 rtrim을 사용하여 오른쪽 또는 왼쪽 또는 문자열의 공백을 청소할 수 있습니다.

이미 받아들여지고 있는 것은 알고 있습니다만, (문자열의 시작과 끝뿐만 아니라) "모든 공백 제거"를 찾고 있는 저 같은 경우에는 다음과 같습니다.

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

2019/6/20 편집: 네, 안 좋아요.이 함수는 "문자 공간이 처음 발생한 시점" 이후 문자열 부분을 반환합니다.그래서 이렇게 말하면 선두와 트랩의 공백이 제거되고 첫 번째 단어가 반환된다고 생각합니다.

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

언급URL : https://stackoverflow.com/questions/6858143/how-to-remove-leading-and-trailing-whitespace-in-a-mysql-field

반응형