2009-09-17 8 views
0
select left(emailaddress, len(emailaddress) - charindex('@', emailaddress)) 

Je reçois le résultat ci-dessous:Comment puis-je extraire la chaîne 'foo' d'une chaîne [email protected]?

[email protected] 

S'il vous plaît corriger l'instruction select ci-dessous. Je dois le faire avec des tonalités d'adresses email et extraire le nom d'utilisateur SEULEMENT.

+0

Retirées votre email réelle, juste au cas où, si je me trompe ne hésitez pas à l'ajouter à nouveau; pas de point partager votre adresse e-mail (si elle était) pour les spammeurs pour obtenir –

Répondre

9

Vous réimplémenter par inadvertance « droit » là :)

Essayez ceci:

select left(emailaddress, charindex('@', emailaddress) - 1) 

Il cherche la position du @, et prend le nombre de caractères à l'exclusion des (c'est le - 1) le symbole @.

Soyez prudent avec les chaînes qui n'ont pas @ bien; vous finirez par une chaîne vide.

+0

:) Je ne sais pas, pourquoi -1? charindex donne un index, et à gauche prend une longueur autant que j'ai compris cela? – StampedeXV

+0

Ayup. Charindex compte à partir de la gauche, donc si vous voulez la partie gauche de la chaîne, il suffit de soustraire 1 pour ne pas inclure le caractère de recherche (@) lui-même. Vous auriez seulement besoin de la longueur de la chaîne si vous vouliez la partie * right * de la chaîne, c'est-à-dire * après * le caractère de recherche. – Martha

+0

exemple: [email protected] charindex retourne 1 gauche ([email protected], 1) retourne un -> ce que nous voulons. Nous n'avons donc pas besoin du moins 1. – StampedeXV

0

Juste une supposition. Je n'ai aucun accès à sql-server, pas une familiarité avec ça. Mais ...

Avez-vous essayé:

select left(emailaddress, charindex('@', emailaddress)) 
+3

Cela inclurait le caractère @.Vous devez soustraire 1 pour obtenir tous les caractères jusqu'à mais ne comprenant pas le caractère de recherche – Martha

+0

En fait, cela dépend si les chaînes sont indexées zéro ou 1-indexées.Si index zéro, charindex renvoie 3, vous obtenez ainsi les 3 caractères de gauche. Une chaîne basée sur 1 retournera 4, donc elle inclurait le '@'. –

+0

Mais dans TransactSQL, charindex est basé sur 1! Voir http://msdn.microsoft.com/en-us/library/ms186323.aspx –

0
select left(emailaddress, charindex('@', emailaddress)-1) 
1

Si vous avez besoin de le faire avec des tonnes (ou tonnes, mais certainement pas tons) des adresses e-mail et/ou que vous faites souvent, le bon moment pour le faire est lorsque les données entrent dans la table (en utilisant un déclencheur d'insertion/mise à jour) et le diviser en deux colonnes à ce moment-là. De cette façon, cela ne se produit que lorsque c'est nécessaire, pas chaque fois que vous faites un select sur la table.

Les données sont presque toujours lire beaucoup plus souvent que écrit donc, en fractionnant à l'insertion/mise à jour, vous minimisez la quantité de travail à faire. Les fonctions par ligne ne s'adaptent jamais bien à mesure que vos tables grossissent et le coût de concaténation de deux colonnes est beaucoup plus faible que celui d'un séparateur de caractères.

Les autres réponses déjà vous dire comment faire la scission. C'est mon affirmation que vous le faites au mauvais moment. Bien sûr, si un changement de schéma est hors de question, ignorez simplement cette réponse. Mais, à mon avis, ce serait la meilleure façon de procéder.

Questions connexes