기존 표에서 각 단어의 첫 글자를 대문자로 바꿉니다.
필드가 있는 기존 테이블 'people_table'이 있습니다.full_name
.
많은 레코드에 'full_name' 필드가 잘못된 케이싱으로 채워집니다.'fred Jones'
아니면'fred jones'
아니면'Fred jones'
.
다음을 통해 이러한 오류 항목을 찾을 수 있습니다.
SELECT * FROM people_table WHERE full_name REGEXP BINARY '^[a-z]';
발견된 각 단어의 첫 글자를 어떻게 대문자로 쓸 수 있습니까? 예를 들어,'fred jones'
된다'Fred Jones'
.
그러기 위해서는 MySQL 기능이 없고, 직접 작성해야 합니다.다음 링크에는 구현된 내용이 있습니다.
http://joezack.com/index.php/2008/10/20/mysql-capitalize-function/
사용하려면 먼저 데이터베이스에 함수를 작성해야 합니다.예를 들어 MySQL 쿼리 브라우저(데이터베이스 이름을 마우스 오른쪽 버튼으로 클릭하고 Create new function을 선택함)를 사용하여 이 작업을 수행할 수 있습니다.
함수를 만든 후 다음과 같은 쿼리를 사용하여 테이블의 값을 업데이트할 수 있습니다.
UPDATE users SET name = CAP_FIRST(name);
한 번만 실행해야 하는데 함수를 만들지 않으려면 다음과 같이 실제로 인코딩된 작업을 수행할 수 있습니다.
UPDATE people_table SET full_name = LOWER(full_name);
UPDATE people_table SET full_name = CONCAT(UPPER(SUBSTR(full_name,1,1)),LOWER(SUBSTR(full_name,2)));
UPDATE people_table SET full_name = REPLACE(full_name,' a',' A');
UPDATE people_table SET full_name = REPLACE(full_name,' b',' B');
UPDATE people_table SET full_name = REPLACE(full_name,' c',' C');
UPDATE people_table SET full_name = REPLACE(full_name,' d',' D');
UPDATE people_table SET full_name = REPLACE(full_name,' e',' E');
UPDATE people_table SET full_name = REPLACE(full_name,' f',' F');
UPDATE people_table SET full_name = REPLACE(full_name,' g',' G');
UPDATE people_table SET full_name = REPLACE(full_name,' h',' H');
UPDATE people_table SET full_name = REPLACE(full_name,' i',' I');
UPDATE people_table SET full_name = REPLACE(full_name,' j',' J');
UPDATE people_table SET full_name = REPLACE(full_name,' k',' K');
UPDATE people_table SET full_name = REPLACE(full_name,' l',' L');
UPDATE people_table SET full_name = REPLACE(full_name,' m',' M');
UPDATE people_table SET full_name = REPLACE(full_name,' n',' N');
UPDATE people_table SET full_name = REPLACE(full_name,' o',' O');
UPDATE people_table SET full_name = REPLACE(full_name,' p',' P');
UPDATE people_table SET full_name = REPLACE(full_name,' q',' Q');
UPDATE people_table SET full_name = REPLACE(full_name,' r',' R');
UPDATE people_table SET full_name = REPLACE(full_name,' s',' S');
UPDATE people_table SET full_name = REPLACE(full_name,' t',' T');
UPDATE people_table SET full_name = REPLACE(full_name,' u',' U');
UPDATE people_table SET full_name = REPLACE(full_name,' v',' V');
UPDATE people_table SET full_name = REPLACE(full_name,' w',' W');
UPDATE people_table SET full_name = REPLACE(full_name,' x',' X');
UPDATE people_table SET full_name = REPLACE(full_name,' y',' Y');
UPDATE people_table SET full_name = REPLACE(full_name,' z',' Z');
모든 단어를 대문자로 사용하려면 사용자 지정 함수를 호출해야 합니다.
-- may help:
-- DROP function if exists capitalize;
DELIMITER $$
CREATE FUNCTION `capitalize`(s varchar(255)) RETURNS varchar(255)
BEGIN
declare c int;
declare x varchar(255);
declare y varchar(255);
declare z varchar(255);
set x = UPPER( SUBSTRING( s, 1, 1));
set y = SUBSTR( s, 2);
set c = instr( y, ' ');
while c > 0
do
set z = SUBSTR( y, 1, c);
set x = CONCAT( x, z);
set z = UPPER( SUBSTR( y, c+1, 1));
set x = CONCAT( x, z);
set y = SUBSTR( y, c+2);
set c = INSTR( y, ' ');
end while;
set x = CONCAT(x, y);
return x;
END$$
DELIMITER ;
이제 이렇게 하면 됩니다.
UPDATE mytable SET thefield = capitalize(thefield);
Nicholas Thompson의 두 가지 유용한 기능이 있습니다.UC_DELEMITER의 세 번째 변수를 false로, 두 번째 변수를 ""로 설정하여 둘 이상의 단어를 대문자로 만들 수 있습니다.
UC_FIRST 임의의 주어진 문자열 대문자화 - 이 함수는 PHP의 ucfirst 함수의 클론입니다.
DROP FUNCTION IF EXISTS UC_FIRST;
CREATE FUNCTION UC_FIRST(oldWord VARCHAR(255)) RETURNS VARCHAR(255)
RETURN CONCAT(UCASE(SUBSTRING(oldWord, 1, 1)),SUBSTRING(oldWord, 2));
UC_DELIMITER 단어 사이에 구분 기호를 사용하여 대문자화
DROP FUNCTION IF EXISTS UC_DELIMITER;
DELIMITER //
CREATE FUNCTION UC_DELIMITER(
oldName VARCHAR(255), delim VARCHAR(1), trimSpaces BOOL
)
RETURNS VARCHAR(255)
BEGIN
SET @oldString := oldName;
SET @newString := "";
tokenLoop: LOOP
IF trimSpaces THEN SET @oldString := TRIM(BOTH " " FROM @oldString); END IF;
SET @splitPoint := LOCATE(delim, @oldString);
IF @splitPoint = 0 THEN
SET @newString := CONCAT(@newString, UC_FIRST(@oldString));
LEAVE tokenLoop;
END IF;
SET @newString := CONCAT(@newString, UC_FIRST(SUBSTRING(@oldString, 1, @splitPoint)));
SET @oldString := SUBSTRING(@oldString, @splitPoint+1);
END LOOP tokenLoop;
RETURN @newString;
END//
DELIMITER ;
예:
SELECT UC_DELIMITER('eric-leroy','-',TRUE);
Eric-Leroy
위에서 코드를 시도해 보았지만 함수에 구문 오류가 있어서 만들지 못했습니다.MySQL의 최신 버전을 위해 작성했습니다. 도움이 될 경우
CREATE FUNCTION `CAP_FIRST`(input VARCHAR(255)) RETURNS varchar(255) CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE len INT;
DECLARE i INT;
DECLARE charnum INT;
declare SortedName varchar(255);
SET len = CHAR_LENGTH(input);
SET input = LOWER(input);
SET i = 1;
set charnum = 1;
set SortedName = '';
WHILE (i <= len) DO
if charnum = 1 then
set SortedName = concat(SortedName,upper(mid(input,i,1)));
set charnum = charnum + 1;
else
if mid(input,i,1) = ' ' then
set SortedName = concat(SortedName,' ');
set charnum = 1;
else
set SortedName = concat(SortedName,mid(input,i,1));
set charnum = charnum + 1;
end if;
end if;
SET i = i + 1;
END WHILE;
RETURN SortedName;
END
DELIMITER $$
CREATE FUNCTION `capitalize`(s varchar(255)) RETURNS varchar(255)
BEGIN
declare c int;
declare x varchar(255);
declare y varchar(255);
declare z varchar(255);
set x = UPPER( SUBSTRING( s, 1, 1));
set y = lower(SUBSTR( s, 2));
set c = instr( y, ' ');
while c > 0
do
set z = SUBSTR( y, 1, c);
set x = CONCAT( x, z);
set z = UPPER( SUBSTR( y, c+1, 1));
set x = CONCAT( x, z);
set y = SUBSTR( y, c+2);
set c = INSTR( y, ' ');
end while;
set x = CONCAT(x, y);
return x;
END$$
DELIMITER ;
Create above function to set First character to capital of each words
간단히:
SELECT
CONCAT(UCASE(LEFT(firstname, 1)), LCASE(SUBSTRING(firstname, 2))) as firstname
FROM PEOPLE
원타이머이면 기능을 만들 필요가 없습니다.아래 내용은 정상적으로 작동합니다.
-- Capitalize first letter of each word in r.name field
SELECT TRIM(CONCAT(
CONCAT(UPPER(SUBSTRING(cname1,1,1)),SUBSTRING(cname1,2)) , " ",
CONCAT(UPPER(SUBSTRING(cname2,1,1)),SUBSTRING(cname2,2)) , " ",
CONCAT(UPPER(SUBSTRING(cname3,1,1)),SUBSTRING(cname3,2))))
FROM (
SELECT
@num_spaces := 1 + LENGTH(c_name) - LENGTH(REPLACE(c_name, ' ', '')) AS
num_spaces,
SUBSTRING_INDEX(CONVERT(c_name,CHAR), ' ', 1) AS cname1,
IF(@num_spaces > 1, SUBSTRING_INDEX(SUBSTRING_INDEX(c_name, ' ', 2), ' ', -1), '') AS cname2,
IF(@num_spaces > 2, SUBSTRING_INDEX(SUBSTRING_INDEX(c_name, ' ', 3), ' ', -1), '') AS cname3
FROM (SELECT (CASE
WHEN UPPER(r.name)COLLATE latin1_general_cs =r.name THEN LOWER(TRIM(r.name))
ELSE TRIM(r.name)
END) AS c_name,r.name
FROM table r) cr) ncr;
참고: IF 절은 @num_spaces 값 이상이어야 합니다.현재 sql은 최대 3단어까지 처리합니다.필요한 경우 추가할 수 있습니다.
먼저 함수를 만듭니다.
DROP FUNCTION IF EXISTS UC_FIRST;
CREATE FUNCTION UC_FIRST(oldWord VARCHAR(255)) RETURNS VARCHAR(255)
RETURN CONCAT(UCASE(SUBSTRING(oldWord, 1, 1)),SUBSTRING(oldWord, 2));
그런 다음 이 쿼리를 사용합니다.
UPDATE mytable SET thefield = UC_FIRST(thefield);
에릭 르로이의 답변이 여기서 가장 흥미로운 답변이지만 두 가지를 놓치고 있습니다.
- UC_FIRST 함수의 소문자: 단어의 첫 글자를 대문자로 쓰려면 다른 글자도 소문자로 쓰라는 뜻입니다.전체 소문자 입력과 함께 작동하지만, 입력 시 «wORD »와 같은 혼재된 경우 «워드 »을 원할 때 «WORD »을 받을 수 있습니다.
- mysql 버전과 설정에 따라 함수 정의에 결정론적 키워드가 필요할 수 있습니다.
함수를 만들기 위해 업데이트된 코드는 다음과 같습니다.
DROP FUNCTION IF EXISTS UC_FIRST;
CREATE FUNCTION UC_FIRST(oldWord VARCHAR(255)) RETURNS VARCHAR(255) DETERMINISTIC
RETURN CONCAT(UCASE(SUBSTRING(oldWord, 1, 1)),LCASE(SUBSTRING(oldWord, 2)));
DROP FUNCTION IF EXISTS UC_DELIMITER;
DELIMITER //
CREATE FUNCTION UC_DELIMITER(
oldName VARCHAR(255), delim VARCHAR(1), trimSpaces BOOL
)
RETURNS VARCHAR(255) DETERMINISTIC
BEGIN
SET @oldString := oldName;
SET @newString := "";
tokenLoop: LOOP
IF trimSpaces THEN SET @oldString := TRIM(BOTH " " FROM @oldString); END IF;
SET @splitPoint := LOCATE(delim, @oldString);
IF @splitPoint = 0 THEN
SET @newString := CONCAT(@newString, UC_FIRST(@oldString));
LEAVE tokenLoop;
END IF;
SET @newString := CONCAT(@newString, UC_FIRST(SUBSTRING(@oldString, 1, @splitPoint)));
SET @oldString := SUBSTRING(@oldString, @splitPoint+1);
END LOOP tokenLoop;
RETURN @newString;
END//
DELIMITER ;
다음과 같은 요청이 있을 것입니다.
SELECT UC_DELIMITER('ThIs IS an ExAMplE oF MIxeD CaseS sTRing',' ',TRUE);
다음을 얻을 수 있습니다.
This Is An Example Of Mixed Cases String
이 작업은 아래 샘플 쿼리를 참조하여 LOWER, UPPER 및 SUBSTRING 기능을 사용하여 수행할 수 있습니다.
Select CONCAT(UPPER(SUBSTRING(name,1,1)),LOWER(SUBSTRING(name,2))) AS Name from table;
UPDATE 쿼리에서 이는
UPDATE table1 SET name = CONCAT(UPPER(SUBSTRING(name,1,1)),LOWER(SUBSTRING(name,2))) WHERE 1
이 phphmyadmin 에서합니다를 UPDATE table_name SET Column_Name = LOWER(Column_Name)
하는 html에서 css합니다를 합니다.text-transform: capitalize;
Excel의 Propert 기능(또는 Google 시트)은 당신이 원하는 것을 정확하게 수행합니다.
따라서 mysql 테이블을 CSV로 Excel(또는 구글 시트)로 내보냅니다.그럼 사용하세요.= Proper(*text_to_capitalize*)
각 단어의 첫 글자를 대문자로 쓰는 것입니다.
그러면 그 엑셀 시트를 CSV로 데이터베이스로 다시 내보냅니다.
PHP를 사용하는 경우...
try{
$con = new PDO("mysql:host=localhost;dbname=dbasename", "root", "");
}
catch(PDOException $e){
echo "error" . $e-getMessage();
}
$select = $con->prepare("SELECT * FROM table");
$select->setFetchMode(PDO::FETCH_ASSOC);
$select->execute();
while($data=$select->fetch()) {
$id = $data['id'];
$column = $data['column'];
$column = ucwords(strtolower($column)); // Capitalize each word
$update = $con->prepare("UPDATE table SET column=:column WHERE id='$id'");
$update->bindParam(':column', $column);
$update->execute();
}
언급URL : https://stackoverflow.com/questions/3278207/capitalize-first-letter-of-each-word-in-existing-table
'source' 카테고리의 다른 글
Linux의 C 프로그램에서 FS가 없는 하드 디스크에 직접 액세스 (0) | 2023.10.09 |
---|---|
스프링 키클로크:사용자 ID 가져오기 (0) | 2023.10.09 |
Linux에서 Ctrl + C 인터럽트 이벤트 처리 (0) | 2023.10.09 |
제출후 각도 - 클리어 폼 입력 (0) | 2023.10.09 |
우분투에서 mysql 서버를 시작할 수 없습니다. (0) | 2023.10.09 |