Je suis en train d'écrire une macro sas, où j'essaie de rejoindre l'une des deux colonnes, selon ce qui existe. Mais quand je donne quelque chose comme cela, il erreur sur, car il veut à la fois les colonnes existent:J'ai besoin de joindre une condition sur l'une des deux colonnes (selon ce qui existe)
%Macro Base_pop(ssc,input_table,POPN_TBL);
PROC SQL;
CREATE TABLE test_&ssc. AS
SELECT B.ACCOUNT_ID
FROM ADL_EXT.&input_table.TB INNER JOIN
ADL_BSE.BRDM_POP_FLG_&POPN_TBL.B
ON B.ACCOUNT_ID = (CASE WHEN %sysfunc(exist(TB.ACCOUNT_ID)) then TB.ACCOUNT_ID
ELSE TB.FAC_ID
END)
WHERE B.FLG = 'Y'
ORDER BY B.ACCOUNT_ID ;
QUIT;
%MEND;
Les erreurs de code en disant TB.Account_id n'existe pas. J'ai aussi essayé la coalescence, ça n'a pas marché aussi.
Une seule des deux colonnes existerait sur les tables transmises à la macro. Donc, je dois rejoindre dynamiquement la colonne qui existe dans ma table actuelle.
Suggestions, s'il vous plaît!
1) La fonction EXIST() teste l'existence d'un ensemble de données, et non d'une variable. (2) Depuis que vous avez créé une macro, vous pouvez utiliser la logique% IF pour générer de manière conditionnelle le code SAS que vous voulez exécuter. De cette façon, vous ne pouvez pas générer de références à des variables qui n'existent pas. Votre exemple n'a aucun code généré de manière conditionnelle. Je suppose que vous voulez remplacer l'instruction CASE par l'instruction% IF ..% THEN% ELSE. – Tom
Vous ne pouvez pas avoir le programmeur qui appelle la macro dire à la macro quel nom de variable à utiliser? – Tom
Merci pour votre réponse Tom! La macro est grande et utilise diverses colonnes qui pourraient exister pour plusieurs tables et pas pour d'autres. Même après que le conditionnel% si la logique est faux, pourquoi le compilateur recherche-t-il les noms de variables qui suivent une condition fausse. Ce n'est pas seulement cette colonne, j'ai plusieurs de ces colonnes, je ne veux pas continuer à ajouter des paramètres, nous n'avons pas de travail. – Rhea