Привет, у меня есть столбец FullName — RamSingh, NehaKaur и т. д. и т. д., и я хочу написать оператор выбора, который возвращает Рама Сингха, Неха Каура и т. д. и т. д. в версии MySql 8.0+. Кроме того, что, если имя состоит из трех заглавных букв, например РамСингхРатхор?
Я пробовал много запросов, например
SELECT REGEXP_REPLACE(CAST('JohnLexxxanon' as BINARY), '^([A-Z][a-z]+)([A-Z][a-z]+)$', '$1 $2');
но это не сработало
@Barmar, Да, MySQL 8.0 использует $1
, $2
, ... для ссылки на захваченные группы. В инструкции об этом не упоминается, но работает.
Вот почему мы любим MySQL :)
пожалуйста, укажите точный результат select version();
, а не просто «8,0+»
@BillKarwin, этот запрос отлично сработал SELECT REGEXP_REPLACE('JohnLexxxanon' COLLATE utf8mb4_0900_as_cs, '^([[:upper:]][[:lower:]]+)([[:upper:]][[:lower:]] + но что, если у нас есть такие имена, как Суреш Сингх Ратхоре, как бы мы с этим справились?
А как насчет ирландского («О'Генри») и голландского («ван дер что-то») и, возможно, других.
Обычно лучше очищать данные во время их вставки.
поможет ли следующее?
SELECT REGEXP_REPLACE('ThisHasMultipleUpperCaseWords' COLLATE utf8mb4_0900_as_cs ,'([A-Z])',' $1');
+---------------------------------------------------------------------------------------------+
| REGEXP_REPLACE('ThisHasMultipleUpperCaseWords' COLLATE utf8mb4_0900_as_cs ,'([A-Z])',' $1') |
+---------------------------------------------------------------------------------------------+
| This Has Multiple Upper Case Words |
+---------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Как уже отмечали другие, «очищение» перед его введением может быть предпочтительнее.
Это очень полезно, приятель<3 большое спасибо @ticktalk
MySQL REGEXP_REPLACE не предоставляет возможности ссылаться на группы захвата, поэтому я не думаю, что вы можете сделать это напрямую. Сделайте это в коде представления вашего приложения.