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을 전혀 잘 다루지 못합니다. 다음은 저에게 효과적인 방법입니다.
- 테이블을 .sql 형식의 텍스트 파일로 내보냅니다.
- 이미 가지고 있던 텍스트메이트에서 파일을 엽니다.
- 대문자 데이터가 있는 행을 선택합니다.
- 텍스트 메뉴에서 "변환"을 선택한 후 "제목 대소문자로"를 선택합니다.
다음의 각 인스턴스를 찾아 바꿉니다.
INSERT INTO `Table` (`Col1`, `Col2`, `Etc`, ...) VALUES
올바른 소문자 값을 사용합니다.
- 테이블을 데이터베이스로 다시 가져옵니다.
- 사용하다
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 솔루션을 찾고 있다면 다음과 같은 여러 업데이트를 수행할 것입니다.
- 초기 문자열: ""앵무새 죽이기"
- 초기 캡으로 변환: "앵무새 죽이기"
- 문자열을 시작하지 않으면 작은 단어를 소문자로 변환: "앵무새 죽이기"
언급URL : https://stackoverflow.com/questions/1191605/is-there-a-simple-way-to-convert-mysql-data-into-title-case
'programing' 카테고리의 다른 글
Node.js의 디렉터리를 제거하지 않고 디렉터리에서 모든 파일을 제거하는 방법 (0) | 2023.08.27 |
---|---|
asp.net EF core run 명령 Scape-DbContext 오류 외부 키 (0) | 2023.08.22 |
MySQL 쿼리에서 열에 대해 반환된 텍스트를 잘라내는 방법 (0) | 2023.08.22 |
문자열 시작 부분에 텍스트 추가 (0) | 2023.08.22 |
셀렉트 박스 스타일이 가능한가요? (0) | 2023.08.22 |