2010-07-19 2 views
22

У меня есть существующая таблица 'people_table', с полем full_name.MySQL - заглавная буква из каждого слова в существующей таблице

Многие записи имеют поле «full_name», заполненное неправильным корпусом. например 'fred Jones' или 'fred jones' или 'Fred jones'.

я могу найти эти странствующие записи с:

SELECT * FROM people_table WHERE full_name REGEXP BINARY '^[a-z]'; 

Как я могу заглавной первую букву каждого слова нашли? например 'fred jones' будет 'Fred Jones'.

ответ

51

Для этого нет функции MySQL, вы должны написать свой собственный. В следующей ссылке есть реализация:

http://joezack.com/index.php/2008/10/20/mysql-capitalize-function/

Для того, чтобы использовать его, сначала нужно создать функцию в базе данных. Вы можете сделать это, например, используя MySQL Query Browser (щелкните правой кнопкой мыши имя базы данных и выберите «Создать новую функцию»).

После создания функции можно обновить значения в таблице с помощью запроса, как это:

UPDATE users SET name = CAP_FIRST(name); 
+1

Спасибо за вашу помощь. Я не уверен, как использовать эту функцию для обновления записей, которые у меня уже есть. (Я боюсь, что это MySQL noob.) – SirRatty

+1

Я отредактировал для публикации, добавив информацию о том, как использовать эту функцию. –

+0

Большое спасибо Vinicius! Я попробую этот подход. – SirRatty

13

Если вы хотите, чтобы все слова заглавными буквами, это будет необходимо, чтобы вызвать пользовательскую функцию.

-- 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); 
+5

Это только фиксирует первое слово, а не всю строку. Например, «fred jones» => «Фред Джонс». Должен идти «Фред Джонс». – jamesthollowell

+0

Вы правы, меняя свой пост. –

4

Я попробовал код из выше, но были ошибки синтаксиса на функции, поэтому не может создать. Написал это для последней версии 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 
+0

Спасибо, ребята, это действительно полезно. – Scott

22

Если вам нужно запустить его только один раз, и вы не хотите, чтобы создать функцию, вы можете сделать что-то действительно-harcoded как:

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'); 
+6

Это лучший ответ. Просто. Не нужно создавать функцию –

+2

Умное решение! –

+2

'UPDATE people_table SET full_name = REPLACE (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (CONCAT (ВЕРХНИЙ (SUBSTR (full_name, 1,1)), LOWER (SUBSTR (полное_имя, 2))), 'a', 'A'), 'b', 'B'), 'c', 'C'), 'd', 'D'), 'e', ​​'E'), 'f', 'F'), 'g', 'G'), 'h' , 'H'), 'i', 'I'), 'j', 'J'), 'k', 'K'), 'l', 'L'), 'm', 'M'), , 'n', 'N'), 'o', 'O'), 'p', 'P'), 'q', 'Q'), 'r', 'R'), 's', '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '') 'y', 'Y'), 'z', 'Z') ' –

2

Вот две полезные функции Николаса Томпсона. Вы можете установить третью переменную UC_DELEMITER равной false, а вторую - «» для заглавной буквы более чем одного слова.

UC_FIRST заглавного любой заданной строки - Эта функция является клоном ucfirst функции в PHP.

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 

Function's Webpage

+0

Работал лечить! Большое спасибо :) –

+0

это отличное решение –

-1

на PHPMyAdmin, запустить это UPDATE table_name SET Column_Name = LOWER(Column_Name) затем на странице HTML, которая отображает данные из таблицы базы данных Используйте CSS text-transform: capitalize;

0

Правильной функции в Excel (или Google листах делает именно то, что вы хотите.

Итак, экспортируйте таблицу mysql в формате CSV и в Excel (или в листы Google). Затем используйте = Proper(*text_to_capitalize*), чтобы извлечь первую букву каждого слова.

Затем просто экспортируйте этот лист Excel как CSV в свою базу данных.

0

Если вы используете 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(); 
} 
3

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

Смежные вопросы