programing

MySQL 데이터를 타이틀 케이스로 변환하는 간단한 방법이 있습니까?

oldcodes 2023. 8. 22. 22:29
반응형

MySQL 데이터를 타이틀 케이스로 변환하는 간단한 방법이 있습니까?

한 열의 모든 데이터가 대문자로 입력된 MySQL 테이블이 있지만 Daring Fireball Title Case 스크립트와 유사한 "작은 단어"를 인식하여 Title Case로 변환해야 합니다.

문자열을 소문자로 변환하기 위한 이 훌륭한 솔루션을 찾았지만, MySQL 버전에서 제목 케이스 기능이 누락된 것 같습니다.이것을 하는 우아한 방법이 있습니까?

편집

Eureka! 말 그대로 제 첫 번째 SQL 함수입니다.제공되는 보증 없음.사용하기 전에 데이터를 백업합니다.:)

먼저 다음 기능을 정의합니다.

DROP FUNCTION IF EXISTS lowerword;
SET GLOBAL  log_bin_trust_function_creators=TRUE; 
DELIMITER |
CREATE FUNCTION lowerword( str VARCHAR(128), word VARCHAR(5) )
RETURNS VARCHAR(128)
DETERMINISTIC
BEGIN
  DECLARE i INT DEFAULT 1;
  DECLARE loc INT;

  SET loc = LOCATE(CONCAT(word,' '), str, 2);
  IF loc > 1 THEN
    WHILE i <= LENGTH (str) AND loc <> 0 DO
      SET str = INSERT(str,loc,LENGTH(word),LCASE(word));
      SET i = loc+LENGTH(word);
      SET loc = LOCATE(CONCAT(word,' '), str, i);
    END WHILE;
  END IF;
  RETURN str;
END;
|
DELIMITER ;

이렇게 하면 모든 단어 instr 발생이 줄어듭니다.

그런 다음 수정된 적절한 함수를 정의합니다.

DROP FUNCTION IF EXISTS tcase; 
SET GLOBAL  log_bin_trust_function_creators=TRUE; 
DELIMITER | 
CREATE FUNCTION tcase( str VARCHAR(128) ) 
RETURNS VARCHAR(128)
DETERMINISTIC
BEGIN 
  DECLARE c CHAR(1); 
  DECLARE s VARCHAR(128); 
  DECLARE i INT DEFAULT 1; 
  DECLARE bool INT DEFAULT 1; 
  DECLARE punct CHAR(17) DEFAULT ' ()[]{},.-_!@;:?/'; 
  SET s = LCASE( str ); 
  WHILE i <= LENGTH( str ) DO
    BEGIN 
      SET c = SUBSTRING( s, i, 1 ); 
      IF LOCATE( c, punct ) > 0 THEN 
        SET bool = 1; 
      ELSEIF bool=1 THEN  
        BEGIN 
          IF c >= 'a' AND c <= 'z' THEN  
            BEGIN 
              SET s = CONCAT(LEFT(s,i-1),UCASE(c),SUBSTRING(s,i+1)); 
              SET bool = 0; 
            END; 
          ELSEIF c >= '0' AND c <= '9' THEN 
            SET bool = 0; 
          END IF; 
        END; 
      END IF; 
      SET i = i+1; 
    END; 
  END WHILE;

  SET s = lowerword(s, 'A');
  SET s = lowerword(s, 'An');
  SET s = lowerword(s, 'And');
  SET s = lowerword(s, 'As');
  SET s = lowerword(s, 'At');
  SET s = lowerword(s, 'But');
  SET s = lowerword(s, 'By');
  SET s = lowerword(s, 'For');
  SET s = lowerword(s, 'If');
  SET s = lowerword(s, 'In');
  SET s = lowerword(s, 'Of');
  SET s = lowerword(s, 'On');
  SET s = lowerword(s, 'Or');
  SET s = lowerword(s, 'The');
  SET s = lowerword(s, 'To');
  SET s = lowerword(s, 'Via');

  RETURN s; 
END; 
| 
DELIMITER ; 

사용.

예상대로 작동하는지 확인합니다.

SELECT tcase(title) FROM table;

사용:

UPDATE table SET title = tcase(title);

출처: http://www.artfulsoftware.com/infotree/queries.php?&bw=1070#122

음, 이와 같은 것이 효과가 있을지도 모릅니다.

UPDATE table_name SET `col_name`= CONCAT( UPPER( SUBSTRING( `col_name`, 1, 1 ) ) , LOWER( SUBSTRING( `col_name` FROM 2 ) ) );

만약 당신이 맞춤형 머리글자어와 다른 맞춤형 대문자화 패턴을 혼합해야 한다면, 나는 Hobodave의 대답을 일반화했습니다.

DELIMITER |
CREATE FUNCTION replaceword( str VARCHAR(128), word VARCHAR(128) )
RETURNS VARCHAR(128)
DETERMINISTIC
BEGIN
  DECLARE loc INT;
  DECLARE punct CHAR(27) DEFAULT ' ()[]{},.-_!@;:?/''"#$%^&*<>'; 
  DECLARE lowerWord VARCHAR(128);
  DECLARE lowerStr VARCHAR(128);

  IF LENGTH(word) = 0 THEN
    RETURN str;
  END IF;
  SET lowerWord = LOWER(word);
  SET lowerStr = LOWER(str);
  SET loc = LOCATE(lowerWord, lowerStr, 1);
  WHILE loc > 0 DO
    IF loc = 1 OR LOCATE(SUBSTRING(str, loc-1, 1), punct) > 0 THEN
      IF loc+LENGTH(word) > LENGTH(str) OR LOCATE(SUBSTRING(str, loc+LENGTH(word), 1), punct) > 0 THEN
        SET str = INSERT(str,loc,LENGTH(word),word);
      END IF;
    END IF;
    SET loc = LOCATE(lowerWord, lowerStr, loc+LENGTH(word));
  END WHILE;
  RETURN str;
END;
|
DELIMITER ;

DELIMITER | 
CREATE FUNCTION tcase( str VARCHAR(128) ) 
RETURNS VARCHAR(128)
DETERMINISTIC
BEGIN 
  DECLARE c CHAR(1); 
  DECLARE s VARCHAR(128); 
  DECLARE i INT DEFAULT 1; 
  DECLARE bool INT DEFAULT 1; 
  DECLARE punct CHAR(27) DEFAULT ' ()[]{},.-_!@;:?/''"#$%^&*<>'; 

  SET s = LCASE( str ); 
  WHILE i <= LENGTH( str ) DO
    BEGIN 
      SET c = SUBSTRING( s, i, 1 ); 
      IF LOCATE( c, punct ) > 0 THEN 
        SET bool = 1; 
      ELSEIF bool=1 THEN  
        BEGIN 
          IF c >= 'a' AND c <= 'z' THEN  
            BEGIN 
              SET s = CONCAT(LEFT(s,i-1),UCASE(c),SUBSTRING(s,i+1)); 
              SET bool = 0; 
            END; 
          ELSEIF c >= '0' AND c <= '9' THEN 
            SET bool = 0; 
          END IF; 
        END; 
      END IF; 
      SET i = i+1; 
    END; 
  END WHILE;

  SET s = replaceword(s, 'a');
  SET s = replaceword(s, 'an');
  SET s = replaceword(s, 'and');
  SET s = replaceword(s, 'as');
  SET s = replaceword(s, 'at');
  SET s = replaceword(s, 'but');
  SET s = replaceword(s, 'by');
  SET s = replaceword(s, 'for');
  SET s = replaceword(s, 'if');
  SET s = replaceword(s, 'in');
  SET s = replaceword(s, 'n');
  SET s = replaceword(s, 'of');
  SET s = replaceword(s, 'on');
  SET s = replaceword(s, 'or');
  SET s = replaceword(s, 'the');
  SET s = replaceword(s, 'to');
  SET s = replaceword(s, 'via');

  SET s = replaceword(s, 'RSS');
  SET s = replaceword(s, 'URL');
  SET s = replaceword(s, 'PHP');
  SET s = replaceword(s, 'SQL');
  SET s = replaceword(s, 'OPML');
  SET s = replaceword(s, 'DHTML');
  SET s = replaceword(s, 'CSV');
  SET s = replaceword(s, 'iCal');
  SET s = replaceword(s, 'XML');
  SET s = replaceword(s, 'PDF');

  SET c = SUBSTRING( s, 1, 1 ); 
  IF c >= 'a' AND c <= 'z' THEN  
      SET s = CONCAT(UCASE(c),SUBSTRING(s,2)); 
  END IF; 

  RETURN s; 
END; 
| 
DELIMITER ;

기본적으로 대소문자를 구분하지 않는 단어 대체 함수와 모든 단어의 첫 글자를 대문자로 표시하고 특정 단어에 대해 일부 변환을 수행하는 함수로 구성됩니다.

누군가에게 도움이 되길 바랍니다.

저는 이런 걸 썼어요.

UPDATE `tablename` 
SET `fieldname` =  CONCAT(UCASE(SUBSTRING(`fieldname`,1,1)),'', LCASE(SUBSTRING(`fieldname`,2,LENGTH(`fieldname`)))) 

참고: 첫 번째 문자만 대문자로 변환됩니다.나머지 값은 소문자로 표시합니다.

간단한 적절한 사례에 대한 나의 해결책:

CREATE FUNCTION `proper_case`(str varchar(128)) RETURNS varchar(128)
BEGIN
DECLARE n, pos INT DEFAULT 1;
DECLARE sub, proper VARCHAR(128) DEFAULT '';

if length(trim(str)) > 0 then
    WHILE pos > 0 DO
        set pos = locate(' ',trim(str),n);
        if pos = 0 then
            set sub = lower(trim(substr(trim(str),n)));
        else
            set sub = lower(trim(substr(trim(str),n,pos-n)));
        end if;

        set proper = concat_ws(' ', proper, concat(upper(left(sub,1)),substr(sub,2)));
        set n = pos + 1;
    END WHILE;
end if;

RETURN trim(proper);
END

사용 방법:

SELECT proper_case("JOHN DOE");

출력:

John Doe

이것은 My SQL 5.0에서 작동합니다.

      DELIMITER |
       CREATE FUNCTION CamelCase(str VARCHAR(8000))
       RETURNS VARCHAR(8000) 
          BEGIN
            DECLARE result VARCHAR(8000);
            SET str = CONCAT(' ',str,' ');
            SET result = '';
            WHILE LENGTH(str) > 1 DO
               SET str = SUBSTR(str,INSTR(str,' ')+1,LENGTH(str));
               SET result = CONCAT(result,UPPER(LEFT(str,1)), LOWER(SUBSTR(str,2,INSTR(str,' ') - 1)) )  ;
               SET str = SUBSTR(str,INSTR(str,' '),LENGTH(str));  
           END WHILE;
        RETURN result;
      END 
     |
     DELIMITER ;

Woo! 저는 SQL을 전혀 잘 다루지 못합니다. 다음은 저에게 효과적인 방법입니다.

  1. 테이블을 .sql 형식의 텍스트 파일로 내보냅니다.
  2. 이미 가지고 있던 텍스트메이트에서 파일을 엽니다.
  3. 대문자 데이터가 있는 행을 선택합니다.
  4. 텍스트 메뉴에서 "변환"을 선택한 후 "제목 대소문자로"를 선택합니다.
  5. 다음의 각 인스턴스를 찾아 바꿉니다.

    INSERT INTO `Table` (`Col1`, `Col2`, `Etc`, ...) VALUES
    

    올바른 소문자 값을 사용합니다.

  6. 테이블을 데이터베이스로 다시 가져옵니다.
  7. 사용하다UPDATE table SET colname=LOWER(colname);소문자여야 하는 열의 소문자 값을 재설정합니다.

이전에 Textmate를 사용해보지 않은 이유는 다른 데이터를 망치지 않고 하나의 열을 Title Case로 변환하는 방법을 찾을 수 없었기 때문인데, 이 방법이 효과가 있는 것 같습니다.당신의 지도와 지원에 감사드립니다!

이것은 나에게 효과가 있습니다.

UPDATE `suburbs` 
SET title2 = CONCAT_WS(' ',
CONCAT(UPPER(LEFT(SUBSTRING_INDEX(title, ' ',1),1)), LOWER(MID(SUBSTRING_INDEX(title, ' ',1),2))),
CONCAT(UPPER(MID(SUBSTRING_INDEX(title, ' ',2),LENGTH(SUBSTRING_INDEX(title, ' ',1)) + 2, 1)), LOWER(MID(SUBSTRING_INDEX(title, ' ',2),3 + LENGTH(SUBSTRING_INDEX(title, ' ',1))))),
CONCAT(UPPER(MID(SUBSTRING_INDEX(title, ' ',3),LENGTH(SUBSTRING_INDEX(title, ' ',2)) + 2, 1)), LOWER(MID(SUBSTRING_INDEX(title, ' ',3),3 + LENGTH(SUBSTRING_INDEX(title, ' ',2))))),
CONCAT(UPPER(MID(SUBSTRING_INDEX(title, ' ',4),LENGTH(SUBSTRING_INDEX(title, ' ',3)) + 2, 1)), LOWER(MID(SUBSTRING_INDEX(title, ' ',4),3 + LENGTH(SUBSTRING_INDEX(title, ' ',3))))),
CONCAT(UPPER(MID(SUBSTRING_INDEX(title, ' ',5),LENGTH(SUBSTRING_INDEX(title, ' ',4)) + 2, 1)), LOWER(MID(SUBSTRING_INDEX(title, ' ',5),3 + LENGTH(SUBSTRING_INDEX(title, ' ',4))))),
CONCAT(UPPER(MID(SUBSTRING_INDEX(title, ' ',6),LENGTH(SUBSTRING_INDEX(title, ' ',5)) + 2, 1)), LOWER(MID(SUBSTRING_INDEX(title, ' ',6),3 + LENGTH(SUBSTRING_INDEX(title, ' ',5))))),
CONCAT(UPPER(MID(SUBSTRING_INDEX(title, ' ',7),LENGTH(SUBSTRING_INDEX(title, ' ',6)) + 2, 1)), LOWER(MID(SUBSTRING_INDEX(title, ' ',7),3 + LENGTH(SUBSTRING_INDEX(title, ' ',6))))),
CONCAT(UPPER(MID(SUBSTRING_INDEX(title, ' ',8),LENGTH(SUBSTRING_INDEX(title, ' ',7)) + 2, 1)), LOWER(MID(SUBSTRING_INDEX(title, ' ',8),3 + LENGTH(SUBSTRING_INDEX(title, ' ',7))))),
CONCAT(UPPER(MID(SUBSTRING_INDEX(title, ' ',9),LENGTH(SUBSTRING_INDEX(title, ' ',8)) + 2, 1)), LOWER(MID(SUBSTRING_INDEX(title, ' ',9),3 + LENGTH(SUBSTRING_INDEX(title, ' ',8))))),
CONCAT(UPPER(MID(SUBSTRING_INDEX(title, ' ',10),LENGTH(SUBSTRING_INDEX(title, ' ',9)) + 2, 1)), LOWER(MID(SUBSTRING_INDEX(title, ' ',10),3 + LENGTH(SUBSTRING_INDEX(title, ' ',9))))),
CONCAT(UPPER(MID(SUBSTRING_INDEX(title, ' ',11),LENGTH(SUBSTRING_INDEX(title, ' ',10)) + 2, 1)), LOWER(MID(SUBSTRING_INDEX(title, ' ',11),3 + LENGTH(SUBSTRING_INDEX(title, ' ',10))))))
WHERE 1

concat(), substring() 및 length()로 이 작업을 수행할 수 있지만 한 단어에 대해서만 작동하는 것을 볼 수 있습니다.mysql 대신에 당신의 애플리케이션 코드에서 이것을 할 수 없는 특별한 이유가 있습니까?

Customer_Name을 대문자로 저장했습니다.예: MUHAMMED MACINTYRE

나는 그것을 타이틀 케이스/적절한 케이스로 반품해야 했습니다.예:무함마드 매킨타이어

나는 MySql에서 다음 코드를 사용했습니다.

SELECT Customer_Name,
 concat(substring(upper(Customer_Name),1,1),
        lower(substring((substring_index(Customer_Name, ' ', 1)), 2, length(Customer_Name))),
        ' ' , 
        upper(substring(substring_index(Customer_Name, ' ', -1),1,1)),
        lower(substring(substring_index(Customer_Name, ' ', -1),2,length(Customer_Name)))
        ) as Customer_Name_TitleCase
FROM customer_table ;

여기에서 결과 확인

이러한 기능을 확인할 수 있는 최종 사례는 설명서에 나와 있습니다.

안타깝게도 LOWER() 및 UPPER() 기능은 있지만 제목 대소문자는 없습니다.가장 좋은 방법은 공백으로 분할하고 작은 단어는 무시하고 나머지 각 단어의 첫 번째 문자에 UPPER를 수행하는 자체 함수를 선언하는 것입니다.

정답은 열에 있는 데이터 유형, 즉 사용자 이름, 장소 이름, 책 제목 등에 따라 달라집니다.SQL 솔루션을 찾고 있다면 다음과 같은 여러 업데이트를 수행할 것입니다.

  1. 초기 문자열: ""앵무새 죽이기"
  2. 초기 캡으로 변환: "앵무새 죽이기"
  3. 문자열을 시작하지 않으면 작은 단어를 소문자로 변환: "앵무새 죽이기"

언급URL : https://stackoverflow.com/questions/1191605/is-there-a-simple-way-to-convert-mysql-data-into-title-case

반응형