Je travaille dans SQL Server 2012. Dans ma table, il existe une colonne appelée Nous pouvons remarquer maintenant qu'il existe des variations d'orthographe dans les données ci-dessus. Ce que je voudrais faire, c'est que si le nombre dans ce cas 128 et les 3 premières lettres dans st_num code> et ses données sont comme ceci:
st_num code> sont identiques, alors ces deux lignes doivent être considérées comme si elles sont identiques telles que la sortie doit être la suivante: p >
St_Num status
-----------------------------
128 TIMBER RUN DR EXP
5 Réponses :
Cela pourrait éventuellement être fait en utilisant une sous-requête de la même manière que vous éliminez les doublons dans une table de sorte que:
SELECT Str_Num, status FROM <your_table> a WHERE NOT EXISTS (SELECT 1 FROM <your_table> b WHERE SUBSTRING(b.Str_Num, 1, 7) = SUBSTRING(a.Str_Num, 1, 7));
Cela produira uniquement la première des lignes correspondantes: Voir le Demo P> P>
Cela échouera s'il y a une "colline de 128 lignes" ou d'autres noms ressemblant ou s'il y a une erreur d'orthographe comme "128 Tmber Run Dr"
Si le numéro dans ce cas 128 et les 3 premières lettres de la colonne ST_NUM sont identiques, ces deux rangées doivent être considérées comme étant les mêmes i> c'est l'exigence.
@Zain ul Abidin: Si cette exigence n'est utilisée que pour renvoyer des données, c'est bon, mais cela conduira à une catastrophe si vous l'utilisez dans une déclaration de mise à jour pour standardiser les adresses.
@forpas ce dont j'ai besoin, c'est que lorsque la première fois la requête passe à travers 123 Timber Run Dr puis lors de la colonne ST_NUM, il se passe à nouveau à Thorugh un champ 123 Timber Run Drive, alors il devrait vérifier que si 123 Tim correspondent, alors ne faites pas Affichez cet enregistrement mais montrez le premier uniquement.
@Zainulabidin Y a-t-il une colonne comme une carte d'identité (entier automatique) qui servirait d'ordre des rangées?
@ forpas non désolé il n'y a pas de colonne d'identification mais comment cela servira le but ici, s'il vous plaît?
S'il y a un identifiant entier, la commande est évidente et la ligne qui sera choisie comme la sortie parmi les correspondances correspondantes est celle avec l'ID minimum.
Vous pouvez utiliser le regroupement par Statut CODE> et
SUBSTRING (ST_NUM, 1,3) CODE>
with t(St_Num, status) as
(
select '128 TIMBER RUN DR' ,'EXP' union all
select '128 TIMBER RUN DRIVE','EXP'
)
select min(St_Num) as St_Num, status
from t
group by status, substring(St_Num,1,3);
St_Num status
----------------- ------
128 TIMBER RUN DR EXP
Je n'approuve pas vraiment votre logique correspondante. . . Mais ce n'est pas votre question. Le gros problème est de savoir combien de temps dure le numéro avant la chaîne. Donc, vous pouvez obtenir la plus courte des adresses à l'aide de:
J'ai toujours un sentiment étrange que vos critères ne suffisent pas pour correspondre aux mêmes adresses, mais cela pourrait aider, car elle considère également la longueur du nombre:
La standardisation des adresses est plus impliquée que l'on peut penser. Jetez un coup d'œil à Stackoverflow.com/cetions / 41249742 / ...