2010-11-29 6 views
3

Je voulais savoir s'il y avait une meilleure façon d'écrire cette mise à jour.Meilleur SQL Remplacer

update Alumni_Export_New 
set phone = replace(replace(replace(replace(phone,'-',''),' ',''),')',''),'(','') 
from tbl 

J'ai une procédure stockée dans MSSQL 2005 pour nettoyer le champ de téléphone dans une table et pensé qu'il devrait y avoir une meilleure façon de le faire alors ce que j'ai.

+0

Quelle est la saveur de SQL que vous utilisez? –

+0

J'utilise MSSQL 2005. –

+0

Il ne résout pas le "problème" de remplacement mais avez-vous envisagé d'utiliser un déclencheur pour effectuer le nettoyage io d'une procédure stockée? Le nettoyage se produirait immédiatement par rapport au planning que vous utiliseriez pour exécuter le sp. –

Répondre

0

Si vous utilisez Microsoft SQL Server, vous devez écrire une fonction définie par l'utilisateur (UDF) pour faire

0

supposer que ce soit pour MySQL, je ne pense pas qu'il y ait une alternative à la fonction pour REPLACE() multiple arguments (tels que TRANSLATE() dans d'autres dbs).

+0

MS SQL Server non MySQL – JeffO

1

Vous pouvez envisager de placer la logique de remplacement dans une fonction définie par l'utilisateur si vous n'aimez vraiment pas le look REPLACE et si cela ne vous dérange pas un coup de performance. Sinon, ce que vous avez est probablement votre meilleure solution.

Exemple:

UPDATE Alumni_Export_New 
SET phone = dbo.StripPhoneNumber(phone) 
FROM tbl 
+0

J'ai un certain nombre d'autres requêtes qui seront toutes exécutées en même temps, donc j'ai pensé que ce SP serait le meilleur. Aussi j'appelle ce formulaire un script Coldfusion. Quels sont les avantages d'une fonction UDF par rapport à SP lorsqu'elle est appelée à partir d'une application? –

+0

@MisterBigs - Je pensais juste à la logique de remplacement elle-même. Vous pouvez conserver la procédure stockée, mais appelez la fonction dans le cadre de votre 'UPDATE'. J'ai mis à jour le poste pour décrire. –

+0

le remplacement ne serait pas appelé par lui-même ailleurs mais dans ce SP donc je suppose que le UDF n'est pas nécessaire. Cela me semble désordonné mais je suppose que je vais le garder tel quel. –

0

Sur Oracle, vous pouvez utiliser la fonction traduire.

update Alumni_Export_New set phone = translate(phone, '-()', '') from tbl 
+2

Bon à savoir, mais l'OP utilise Microsoft SQL Server. –

+0

En outre, ce n'est pas un remplacement direct de la requête OP - qui remplace chaque caractère, pas tous ensemble. –

0

Avez toute la chaîne, si vous avez besoin caractères numériques uniquement à l'intérieur i

CREATE FUNCTION fn_retun_only_numbers 
(
    @myOrgString varchar(50) 
) 
RETURNS varchar(50) 
AS 
BEGIN 
    declare @lenOfString int, @i int 
    declare @oneChar varchar(1),@newString varchar(50) 


    set @lenOfString = (select len(@myOrgString)) 
    set @i = 1 
    set @newString= '' 

    while (@lenOfstring>[email protected]) 
    begin 
    set @oneChar = substring(@myOrgString,@i,1) 

if ((@oneChar)in ('0','1','2','3','4','5','6','7','8','9')) 
begin 
set @[email protected][email protected] 
end 
set @[email protected]+1 
end 
return @newString 
END 
GO 

Et ainsi que d'autres mentionné, vous pouvez maintenant

update Alumni_Export_New 
set phone = dbo.fn_retun_only_numbers(phone) 
from tbl 

Je n'ai pas considérer vous faire creux de la boucle SQL à la maison peut-être il ya peut-être quelques erreurs dans le code

Ceci n'est peut-être pas la meilleure solution, mais si vous devez être sûr d'alwa ys n'obtient que des nombres Peut-être est-ce une approche possible

Questions connexes