Правильно использовать заглавные буквы в SQL - PullRequest
3 голосов
/ 22 октября 2010

Я хотел бы правильно использовать заглавные буквы, что в данном случае означает:

  • Первая буква заглавная.
  • Первая буква после пробела начинается с заглавной буквы («Ван Хельсинг», а не «Ван Хелсинг»)
  • Первая буква после тире пишется с большой буквы («Джонсон-Смит», а не «Джонсон-Смит»)
  • Другие буквы не пишутся с заглавной буквы.

Первое и последнее требования легко обрабатываются:

CONCAT(LEFT(name, 1), LOWER(RIGHT(name, LENGTH(name) - 1)))

Остальные сложнее. Я написал оператор REPLACE, вложенный в 54 раза (конечно, не вручную, я использовал Excel)

REPLACE(REPLACE(REPLACE(REPLACE(...,' b',' B'),'-b','-B'),' a',' A'),'-a','-A')

но я чувствую, что должно быть более элегантное и удобное решение. Есть идеи?

Если есть встроенная функция, которая похожа, но не идентична моим требованиям, то, вероятно, будет хорошо.


Редактировать: Этот сценарий будет запускаться только на именах, которые уже потеряли свою заглавную букву, поэтому при неправильном обращении с неясными именами нет опасности. Впрочем, было бы неплохо обрабатывать апострофы, такие как пробелы и тире. Просмотр текущих данных показывает, что многие (~ 30%) имен имеют хотя бы одно из [- '].

Ответы [ 5 ]

4 голосов
/ 22 октября 2010

А как насчет "Ван ден Берг" (в нижнем регистре 'd'). Что насчет "Макдональда" или "О'Рейли".

Считать плохие имена людей обычно плохой идеей, потому что всегда найдется законное имя, которое нарушит вашу проверку.

См. Также мой ответ на предыдущий аналогичный вопрос здесь: Как "проверить" человеческие имена в CakePHP?

2 голосов
/ 12 декабря 2011

Код разочарования с опубликованными формами не работает правильно ... он правильно использует заглавные буквы первого и последнего слова в строке и удаляет все, что находится между ними (если есть> 2).Кто-то опубликовал исправленную версию по URL-адресу, который он разместил ...

(см. Сообщение Мэтта Кавано от 15 мая 2009 г. в 15:52 по адресу: http://dev.mysql.com/doc/refman/5.1/en/string-functions.html)

1 голос
/ 22 октября 2010

Похоже, что MySQL не имеет функции INITCAP, но я нашел код для нее здесь:

http://dev.mysql.com/doc/refman/5.1/en/string-functions.html

И код тоже:

DELIMITER $$
DROP FUNCTION IF EXISTS `initcap` $$
CREATE FUNCTION `initcap`(x char(30)) RETURNS char(30) CHARSET utf8
BEGIN
SET @str='';
SET @l_str='';
WHILE x REGEXP ' ' DO
SELECT SUBSTRING_INDEX(x, ' ', 1) INTO @l_str;
SELECT SUBSTRING(x, LOCATE(' ', x)+1) INTO x;
SELECT CONCAT(@str, ' ', CONCAT(UPPER(SUBSTRING(@l_str,1,1)),LOWER(SUBSTRING(@l_str,2)))) INTO @str;
END WHILE;
RETURN LTRIM(CONCAT(@str, ' ', CONCAT(UPPER(SUBSTRING(x,1,1)),LOWER(SUBSTRING(x,2)))));
END $$
DELIMITER ;

Отказ от ответственности: я не писал этот код, я даже не проверял его ...

1 голос
/ 22 октября 2010

Возможно, вы могли бы использовать пользовательскую функцию, которую было бы намного проще использовать.

1 голос
/ 22 октября 2010

Это не будет красиво, но вы можете использовать SUBSTRING_INDEX, чтобы найти первый пробел и тире, и условно использовать все, что следует за ним.

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