2013-07-12 1 views
0

J'ai FullName colonne et je suis extrais la First Name et last name en utilisant la requête suivanteProblème extraction d'abord et LastName de la colonne Nom complet

select SUBSTRING(FULL_NAME, 1, CHARINDEX(' ', FULL_NAME) - 1) AS FirstName, 
     SUBSTRING(FULL_NAME, CHARINDEX(' ', FULL_NAME) + 1, 500) AS LastName 
from [dbo].[TABLE] 

Mais dans la colonne Full Name il y a tout premiers noms, quelque 10 chiffres numéros de téléphone, extensions à 4 chiffres et du texte comme 'ceci est un cas spécial'.

Comment modifier ma requête pour prendre en compte ces exceptions? Et aussi quand il n'y a que des mots simples dans la colonne Nom complet, j'obtiens ce message d'erreur suivant:

"Paramètre de longueur non valide passé à la fonction GAUCHE ou SUBSTRING."

+0

sonne comme un emploi pour une fonction me –

+1

On dirait que vous avez besoin de repenser cette table à moi. Pourquoi n'y a-t-il pas de noms? – Yatrix

+0

Avez-vous effectué une importation en bloc et méjugé les séparateurs de champs? Dans tous les cas, essayez d'utiliser une colonne standard nom_principal, une colonne standard sur_name et une colonne full_name calculée à la place. –

Répondre

0

vous pouvez aller avec une fonction ce qui vous permet de mettre dans une logique dont vous avez besoin dans la transformation et de garder les choses un peu plus facile à lire :

create function dbo.namepart(@fullname varchar(50), @part varchar(5)) 
returns varchar(10) 
as 
begin 
    declare @first varchar(50) 
    declare @last varchar(50) 
    declare @sp int 
    if @fullname like '%special value%' return '' 
    if @fullname like '% %' 
    begin 
    set @sp = CHARINDEX(' ', @fullname) 
    set @first = left(@fullname, @sp - 1) 
    set @last = substring(@fullname,@sp + 1 ,50) 
    if isnumeric(@last) <> 0 set @last = '' 
    end 
    else 
    begin 
    set @first = @fullname 
    set @last = '' 
    end 
    if @part like 'f%' 
    return @first 
    else 
    return @last 
    return '' 
end 

Données d'échantillons

create table blah(
    full_name varchar(50) 
) 

insert into blah values ('john smith'), ('paul 12345'),('evan'),('special value') 

Et voir si ça marche

select 
    dbo.namepart(full_name,'first') first, 
    dbo.namepart(full_name,'last') last, 
    full_name 
from blah 

http://sqlfiddle.com/#!6/eb28f/2

+0

Bonjour Ian Kenney merci beaucoup Monsieur. Tu es un génie – user2574690

0

Parsing bons noms des champs de forme libre est pas une tâche facile ...

je suggère une double approche.

Identifier les modèles communs, à savoir que vous pourriez trouver le numéro de téléphone avec quelque chose comme ça

Where IsNumeric(Replace(Field,'-','')=1 

et vous pouvez identifier les noms simples avec

Where charindex(' ',trim(field))=0 

etc.

Une fois que vous avez identifié eux, le code d'écriture pour tenter de les séparer ...

Vous pouvez utiliser le code que vous avez ci-dessus avec la clause WHERE suivante

select SUBSTRING(FULL_NAME, 1, CHARINDEX(' ', FULL_NAME) - 1) AS FirstName, 
     SUBSTRING(PRQ_BP_CONTACT_NAME, CHARINDEX(' ', FULL_NAME) + 1, 500) 
     AS LastN 
    from [dbo].[TABLE] 
    where charindex(' ',trim(field))>0 and Where IsNumeric(Replace(Field,'-','')=0 

Utilisez les clauses où (a) assurez-vous que vous obtenez uniquement les enregistrements que vous pouvez analyser et (b) aider à identifier les cas loufoques vous aimez le besoin de le faire à la main ...

Bonne chance

Questions connexes