0
votes

MSSQL Remplacer la chaîne par une autre chaîne après un certain caractère

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.


0 commentaires

4 Réponses :


2
votes

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';


3 commentaires

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.



2
votes

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>

Démo2

p>


0 commentaires

-1
votes

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');


2 commentaires

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 ....



0
votes

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', '@');


2 commentaires

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