2010-12-08 23 views
1

J'ai une fonction qui normalise les adresses. Ce que je voudrais faire maintenant, c'est enlever toutes les chaînes dans une liste limitée, spécifiée si elles se produisent à la fin de la chaîne. Disons que les chaînes que je veux supprimer sont 'st', 'ave', 'rd', 'dr', 'ct' ... Si la chaîne se termine par l'une de ces chaînes, je veux les supprimer. Quelle est la meilleure façon d'y parvenir, en utilisant T-SQL (ceci fera et non faire partie d'une instruction select)?Quel est le moyen le plus simple/le meilleur pour supprimer des sous-chaînes à la fin d'une chaîne?

Edit:

C'est une fonction qui accepte une adresse et formate. Je voudrais intégrer le code et la liste, mais de la manière la plus simple possible. Par exemple, un code avec lequel j'ai joué est:

if @address LIKE '%st' 
SET @address = substring(@address, 1, PatIndex('%st', @address) - 1) 

Est-ce une bonne méthode? Comment puis-je le mettre dans une sorte de boucle afin que je puisse répéter ce code avec des valeurs différentes (autres que st)?

Répondre

1

Ajout des valeurs à rogner à une nouvelle table vous permet de

  • ajouter facilement de nouvelles valeurs
  • utiliser ce tableau pour nettoyer les adresses

Déclaration SQL

DECLARE @Input VARCHAR(32) 
SET @Input = 'Streetsstaverddrad' 

DECLARE @Trim TABLE (Value VARCHAR(32)) 

INSERT INTO @Trim 
SELECT 'st' 
UNION ALL SELECT 'ave' 
UNION ALL SELECT 'rd' 
UNION ALL SELECT 'dr' 
UNION ALL SELECT 'ad' 

WHILE EXISTS (
    SELECT * 
    FROM (
      SELECT [Adres] = @Input 
      ) i 
      INNER JOIN @Trim t ON i.Adres LIKE '%' + t.Value 
) 
BEGIN 
    SELECT @Input = SUBSTRING(Adres, 1, LEN(Adres) - LEN(t.Value)) 
    FROM (
      SELECT [Adres] = @Input 
     ) i 
      INNER JOIN @Trim t ON i.Adres LIKE '%' + t.Value 
END   

SELECT @Input 
+0

C'est une fonction qui accepte une adresse à la fois et il normalise ... Il n'y a pas de table « adresses » – froadie

+0

@froadie, je avoir changé le concept à utiliser dans une fonction. La chaîne 'Streetst' serait remplacée par votre variable d'entrée. Rappelez-vous que cette solution supprime seulement * une * fin. –

+0

quand j'essaye d'employer ce code j'obtiens "la syntaxe incorrecte près du mot-clé" avec "". Aussi, pouvez-vous expliquer ce que vous essayez de faire avec le code "with q ..."? Je n'ai pas vraiment vu de syntaxe comme celle-ci et je ne comprends pas ce que ça fait ... – froadie

0

Dans SQL Server 2005, il est possib le pour définir une fonction utilisateur qui active regular expression matching. Vous devrez définir une fonction qui supprime les chaînes de fin. Un RegEx pour correspondre aux scénarios que vous mentionnez serait quelque chose comme ...

\s+(ave|rd|dr|ct)\s*$