MySQL - Прописать первую букву каждого слова в существующей таблице. - PullRequest
26 голосов
/ 19 июля 2010

У меня есть существующая таблица 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'.

Ответы [ 10 ]

54 голосов
/ 19 июля 2010

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

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

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

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

UPDATE users SET name = CAP_FIRST(name);
29 голосов
/ 02 ноября 2015

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

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');
15 голосов
/ 08 апреля 2014

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

-- 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);
4 голосов
/ 21 июня 2017

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
4 голосов
/ 31 октября 2014

Я пробовал код сверху, но имел синтаксические ошибки в функции, поэтому не смог его создать.Написал это для последней версии 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
3 голосов
/ 28 ноября 2015

Вот две полезные функции Николаса Томпсона.Вы можете установить для 3-й переменной 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  

Веб-страница функции

0 голосов
/ 08 февраля 2019

Просто:

SELECT
CONCAT(UCASE(LEFT(firstname, 1)), LCASE(SUBSTRING(firstname, 2))) as firstname
FROM PEOPLE
0 голосов
/ 04 апреля 2017

Если вы используете 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();
}
0 голосов
/ 16 февраля 2017

Функция Proper в Excel (или листы Google делают именно то, что вы хотите.

Итак, экспортируйте свою таблицу MySQL в CSV и в Excel (или листы Google).= Proper(*text_to_capitalize*) для прописных букв первой буквы каждого слова.

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

0 голосов
/ 04 сентября 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...