Это берет smhg отсюда и curt's из Последний индекс данной подстроки в MySQL и объединяет их. Это для mysql, все, что мне нужно было получить приличное разделение имени на first_name last_name с фамилией, состоящей из одного слова, с именем перед всем этим единственным словом, где имя может быть нулевым, 1 словом, 2 словами или более 2 слов. Т.е.: ноль; Мэри; Мэри Смит; Мэри А. Смит; Мэри Сью Эллен Смит;
Так что, если имя - одно слово или ноль, last_name - ноль. Если имя -> 1 слово, last_name - последнее слово, а first_name - все слова перед последним словом.
Обратите внимание, что я уже обрезал такие вещи, как Джо Смит-младший; Джо Смит эсквайр и так далее, вручную, что, конечно, было болезненно, но для этого было достаточно мало, поэтому вы должны убедиться, что действительно посмотрите на данные в поле имени, прежде чем решить, какой метод использовать.
Обратите внимание, что это также обрезает результат, поэтому вы не получите пробелов перед или после имен.
Я просто публикую это для тех, кто может погуглить здесь в поисках того, что мне нужно. Это работает, конечно, сначала проверьте его с помощью выбора.
Это единовременная вещь, поэтому меня не волнует эффективность.
SELECT TRIM(
IF(
LOCATE(' ', `name`) > 0,
LEFT(`name`, LENGTH(`name`) - LOCATE(' ', REVERSE(`name`))),
`name`
)
) AS first_name,
TRIM(
IF(
LOCATE(' ', `name`) > 0,
SUBSTRING_INDEX(`name`, ' ', -1) ,
NULL
)
) AS last_name
FROM `users`;
UPDATE `users` SET
`first_name` = TRIM(
IF(
LOCATE(' ', `name`) > 0,
LEFT(`name`, LENGTH(`name`) - LOCATE(' ', REVERSE(`name`))),
`name`
)
),
`last_name` = TRIM(
IF(
LOCATE(' ', `name`) > 0,
SUBSTRING_INDEX(`name`, ' ', -1) ,
NULL
)
);