Comprobar si existe un campo en una tabla SAS


En ocasiones necesitamos saber si existe un fichero o una tabla y para ello utilizamos la función exist, pero ¿qué pasa si queremos saber si en la tabla que estamos procesando hay un determinado campo?

Es una situación menos habitual y lo malo es que no existe una función para evaluarlo directamente, así que nos toca remangarnos y usar un poco nuestra imaginación.

Existen varias soluciones para abordar esto, seguro que cada una más adecuada en según qué circunstancias. En este caso vamos a evaluar si en la tabla SASHELP.US_DATA tenemos el campo «capital» y os propongo varias soluciones:

La primera que se me ocurre es utilizando vectores:

%macro comprobar_variable1(campo_buscado=);
    %let dsid = %sysfunc(open(SASHELP.US_DATA));
    %let rc = %sysfunc(fetchobs(&dsid,1));
    %let r1 = %sysfunc(varnum(&dsid,&campo_buscado));
    %let r2 = %sysfunc(varnum(&dsid,&campo_buscado));
    %let resultado = %sysfunc(max(&r1>0,&r2>0));
    %put &=resultado;
    %let rc = %sysfunc(close(&dsid));
%mend;

%comprobar_variable1(campo_buscado=CAPITAL);
%comprobar_variable1(campo_buscado=region);

Otra solución aparentemente más sencilla de programar sería utilizando proc contents. A mi me resulta muy útil este procedimiento para resolver muchos problemas de automatización de procesos.

%macro comprobar_variable2(campo_buscado=);
    proc contents data=SASHELP.US_DATA out=VARIABLES (keep=name) noprint;
    run;

    proc sql noprint;
        select count(1) into :resultado
        from VARIABLES
        where name=upcase("&campo_buscado");
    quit;

    %put &=resultado;
%mend;
%comprobar_variable2(campo_buscado=CAPITAL);
%comprobar_variable2(campo_buscado=region);

Os propongo que enviéis alguna más que se os pueda ocurrir.