Je reçois un identifiant de courrier électronique dans ma procédure sql.Je dois remplacer le client de messagerie par une chaîne définie.
Supposons que je reçoive un identifiant de courrier électronique tel que abc@gmail.com ou pqr@yahoo.com ou mnz @ hotmail.com, dans de tels cas, je dois remplacer @ gmail.com / @ yahoo.com par une chaîne fixe.
abc@gmail.com - abc@outlook.com pqr@yahoo.com - pqr@outlook.com mnz@hotmail.com - mnz@outlook.com
La chaîne après @ sera donc remplacée par mon chaîne définie indépendamment des données reçues dans la procédure.
J'ai essayé la méthode Replace mais cela n'a pas fonctionné. Je sais que je dois utiliser les fonctions charindex, substring & left pour le faire fonctionner mais sans obtenir la bonne combinaison.
4 Réponses :
Je garderais les choses simples ici et utiliserais simplement CHARINDEX
avec LEFT
:
UPDATE yourTable SET email_id = LEFT(email_id, CHARINDEX('@', email_id) - 1) + 'outlook.com';
a reçu un message d'erreur comme "La fonction de gauche nécessite 2 argument (s)."
J'ajouterais WHERE email_id LIKE '% @%'
.
Je suppose que l'identifiant d'email contiendra toujours @ donc là où la condition n'est pas nécessaire.
Vous pouvez utiliser REPLACE ()
avec CHARINDEX ()
comme
UPDATE S SET S.Str = REPLACE(S.Str, E.V, '@outlook.com') FROM Strings S JOIN (VALUES('@gmail.com'), ('@hotmail.com'), ('@yahoo.com')) E(V) ON S.Str LIKE CONCAT('%', E.V, '%');
Voici aussi une autre façon
CREATE TABLE Strings( Str VARCHAR(45) ); INSERT INTO Strings VALUES ('abc@gmail.com'), ('pqr@yahoo.com'), ('mnz@hotmail.com'); UPDATE Strings SET Str = REPLACE(Str, SUBSTRING(Str, CHARINDEX('@',Str), LEN(Str)), '@outlook.com'); SELECT * FROM Strings;
Démo1 p>
p>
Vous pouvez utiliser les requêtes suivantes pour remplacer tbl_name et column_name en fonction de vos données:
UPDATE tbl_name SET column_name = replace(column_name, 'gmail.com', 'outlook.com'); UPDATE tbl_name SET column_name = replace(column_name, 'yahoo.com', 'outlook.com'); UPDATE tbl_name SET column_name = replace(column_name, 'hotmail.com', 'outlook.com');
Et qu'en est-il de tous les autres domaines? Cela ne va pas bien.
"BikerDude.HogMail.Comics@42.com" devient quoi? Eh bien, "gmail.com" est là-dedans donc ....
Si vous utilisez SQL Server 2017, vous pouvez l'utiliser comme sous-requête dans votre requête principale:
SELECT value + '@outlook.com' FROM ( SELECT value, CHARINDEX('@', 'pqr@yahoo.com') AS atIndex, CHARINDEX(value, 'pqr@yahoo.com') AS partIndex FROM STRING_SPLIT('pqr@yahoo.com', '@') ) AS K WHERE K.atIndex > K.partIndex;
En savoir plus sur FIRST_VALUE
: https: // docs.microsoft.com/en-us/sql/t-sql/functions/first-value-transact-sql?view=sql-server-2017
En savoir plus sur STRING_SPLIT
: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017 p >
Mise à jour
Comme @TimBiegeleisen l'a mentionné, Microsoft docs dit:
Les lignes de sortie peuvent être dans n'importe quel ordre. La commande n'est pas garantie de correspond à l'ordre des sous-chaînes dans la chaîne d'entrée
Pour surmonter cela, nous pouvons même réécrire la requête comme suit:
SELECT FIRST_VALUE(value) OVER (ORDER BY (SELECT NULL)) + '@outlook.com' FROM STRING_SPLIT('pqr@yahoo.com', '@');
Si vous lisez attentivement la documentation de STRING_SPLIT
, vous remarquerez également qu'il n'y a aucune garantie sur l'ordre de la table. Ainsi, FIRST_VALUE
peut ne pas toujours fonctionner ici.
@TimBiegeleisen Excellent avis. J'ai mis à jour la réponse