Это берет smhg отсюда и Курта от Last index of a given substring in MySQL и объединяет их. Это для mysql, все, что мне нужно было, чтобы получить приличный раскол имени для first_name last_name с фамилией, одним словом, первым именем все до этого единственного слова, где имя может быть нулевым, 1 слово, 2 слова или более 2 слов. Т.е.: Null; Мэри; Мэри Смит; Мэри А. Смит; Мэри Сью Эллен Смит;
Так что, если имя является одним словом или null, last_name равно null. Если имя> 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
)
);
«Все записи имеют этот формат« Имя Фамилия »(без кавычек и пробел между ними)». ... чудом ... Пожалуйста, ** пожалуйста **, не забывайте о таких людях, как я, когда принимаете решения в базе данных. Слишком часто я получаю сайты, рассказывающие мне, что моя фамилия содержит символ * незаконного * (sic) ... :( –
@StijndeWitt. Вы правы в целом, однако кажется, что эта база данных не содержит вашего имени, по крайней мере, не в его официальная форма. В моей стране сначала написаны фамилии, поэтому я также должен быть «дискриминирован» в этой таблице данных. Посмотрите это -> –