2010-12-13 65 views
0

J'ai une table appelée FinalForgotten qui ne contient qu'un champ appelé aname. Le champ pourrait ressembler à Smith John ou Smith, John. Ainsi, le nom et le prénom sont dans le même champ et délimités par un espace ou une virgule. Le champ de défense contient trois champs: first_name, last_name, middle_initial. Le champ first_name contiendra des données qui correspondent exactement à un champ IName de données IN (par exemple John). Et le champ last_name contiendra des données qui correspondent exactement à un champ de données IN IN (par exemple Smith). J'essaie d'obtenir tous les enregistrements anonymes de FinalForgotten avec une initiale du milieu dans une nouvelle table (par exemple Smith, John S). La table de défense est ce qui a cette initiale du milieu.Vérification de l'espace ou de la virgule dans le tableau - MS-Access

Cela fonctionnerait:

SELECT left([aname],InStr(1,[aname],",")-1) & " "& right([aname],Len(aname)-InStr(1,[aname],",")) & " "& summary_judgment.middle_initial AS fullnameINTO FinalForgottenWithMiddle FROM FinalForgotten INNER JOIN summary_judgment ON((left(FinalForgotten.aname,InStr(1,FinalForgotten.[aname],",")-1))=summary_judgment.last_name) AND((right(FinalForgotten.aname,Len(FinalForgotten.aname)-InStr(1,FinalForgotten.[aname],","))=summary_judgment.first_name)); 

Mais il retournera « appel de procédure non valide » doit FinalForgotten contenir un champ qui ne dispose pas d'une virgule comme: Smith John.

Par conséquent, pour résoudre ce problème, j'ai essayé de tenir compte si une virgule était dans le domaine ou non:

SELECT left([aname], IIF(instr([aname], ",") = 0, InStr(1,[aname]," ")-1),InStr(1,[aname],",")-1) & ", " & right([aname], IIF(instr([aname], ",") = 0,Len(aname)-InStr(1,[aname]," "),Len(aname)-InStr(1,[aname],",") & " " & defense_final.middle_initial AS fullname INTO FinalForgottenWithMiddle 
FROM FinalForgotten INNER JOIN defense_final ON 
((right(FinalForgotten.aname,IIF(instr([aname], ",") = 0,Len(FinalForgotten.aname)-InStr(1,FinalForgotten.[aname]," ")),Len(FinalForgotten.aname)-InStr(1,FinalForgotten.[aname],","))=defense_final.first_name)) 
AND 
((left(FinalForgotten.aname,,IIF(instr([aname], ",") = 0,InStr(1,FinalForgotten.[aname]," ")-1)),InStr(1,FinalForgotten.[aname],",")-1))=defense_final.last_name); 

Cela me donne une erreur « manquant de syntaxe de l'opérateur » et met en évidence le mot.

Merci pour la réponse.

Répondre

0

Il semble y avoir pas mal de parenthèses manquantes.

SELECT left(
     [aname], 
     IIF(instr([aname], ",") = 0, 
     InStr(1,[aname]," ")-1, 
     InStr(1,[aname],",")-1 
     ) 
    ) 
    & ", " & 
    right(
     [aname], 
     IIF(instr([aname], ",") = 0, 
     Len(aname)-InStr(1,[aname]," "), 
     Len(aname)-InStr(1,[aname],",") 
     ) 
     ) 
    & " " & 
    defense_final.middle_initial AS fullname 
INTO FinalForgottenWithMiddle 
FROM FinalForgotten 
INNER JOIN defense_final 
ON 

    right(FinalForgotten.aname, 
    IIF(instr([aname], ",") = 0, 
    Len(FinalForgotten.aname)-InStr(1,FinalForgotten.[aname]," "), 
    Len(FinalForgotten.aname)-InStr(1,FinalForgotten.[aname],",") 
    ) 
    )=defense_final.first_name 

AND 

    left(FinalForgotten.aname, 
    IIF(instr([aname], ",") = 0, 
     InStr(1,FinalForgotten.[aname]," ")-1, 
     InStr(1,FinalForgotten.[aname],",")-1 
     ) 
    )=defense_final.last_name 
+0

Merci J'ai aussi aimé la façon dont vous avez présenté la requête. – JohnMerlino