Maison > Questions et réponses > le corps du texte
P粉3015232982023-08-18 13:51:58
Quelques points à considérer.
Basé sur la question
Considérez l'exemple de données suivant où FullName
les colonnes comprennent jusqu'à trois mots séparés par des espaces
create table NameTable ( ID int, FullName varchar(100), age int, primary key(ID) ); insert into NameTable (ID, FullName, age) values (1, 'ben thompson', 23), (2, 'Martin Luther King', 23);
Requête,
SELECT SUBSTRING_INDEX(TRIM(FullName), ' ', -1) LastName, SUBSTRING_INDEX(TRIM(FullName), ' ', 1) FirstName, SUBSTR(FullName, LOCATE(' ',FullName) + 1, (CHAR_LENGTH(FullName) - LOCATE(' ',REVERSE(FullName)) - LOCATE(' ',FullName))) AS MiddleName FROM NameTable;
Résultats,
LastName FirstName MiddleName Thompson Ben King Martin Luther
Apportez d'abord des modifications en modifiant la structure de la table. S'il y a un grand nombre de transactions, je recommande de verrouiller la table de manière appropriée
.SET autocommit=0; LOCK TABLES NameTable WRITE; alter table NameTable add column FullNameReverseOrder varchar(100) after FullName; COMMIT; UNLOCK TABLES;
Pour mettre à jour les colonnes nouvellement ajoutées LastName, MiddleName et FirstName, utilisez la commande suivante :
update NameTable set FullNameReverseOrder = concat_ws(' ' ,SUBSTRING_INDEX(TRIM(FullName), ' ', -1), SUBSTR(FullName, LOCATE(' ',FullName)+1, (CHAR_LENGTH(FullName) - LOCATE(' ',REVERSE(FullName)) - LOCATE(' ',FullName))), SUBSTRING_INDEX(TRIM(FullName), ' ', 1) );
Choisissez,
select * from NameTable;
Résultats
ID FullName FullNameReverseOrder age 1 ben thompson thompson ben 23 2 Martin Luther King King Luther Martin 23
Maintenant, si vous souhaitez que ce processus se déroule automatiquement, pensez à créer un déclencheur.
CREATE TRIGGER FullNameReverseOrderUpdate BEFORE INSERT ON NameTable FOR EACH ROW BEGIN SET new.FullNameReverseOrder = (concat_ws(' ' ,SUBSTRING_INDEX(TRIM(new.FullName), ' ', -1), SUBSTR(new.FullName, LOCATE(' ',new.FullName)+1, (CHAR_LENGTH(new.FullName) - LOCATE(' ',REVERSE(new.FullName)) - LOCATE(' ',new.FullName))),SUBSTRING_INDEX(TRIM(new.FullName), ' ', 1) )); END;
Insérer la valeur de test
insert into NameTable (ID, FullName, age) values (3, 'Arthur Thompson', 23); select * from NameTable;
Résultats
ID FullName FullNameReverseOrder age 1 ben thompson thompson ben 23 2 Martin Luther King King Luther Martin 23 3 Arthur Thompson Thompson Arthur 23