T:SAS/ Proc SQL — выбрать в: не в:

В настоящее время у меня есть файл данных содержимого proc, который выглядит так:

DATA CONTENTS;
    INPUT NAME $;
    DATALINES;
        VARA
        VARB
        VARC
        VARD
        VARE
    ;
RUN;

и я хочу превратить эту последнюю переменную в переменную макроса, например

PROC SQL;
    SELECT NAME INTO: MACRO_VARIABLE
        SEPARATED BY " "
            FROM CONTENTS
                WHERE VARNUM > 1
                AND
                WHERE NAME NOT IN:(VARA VARB)
;
QUIT;

Новое дополнение, которое я пытаюсь приспособить, это

Where name not in:(VarA varB)

есть ли способ сделать это, поскольку мои VARA и VARB являются пользовательскими входными данными со страницы моего контроллера, я не могу указать, чтобы они были разделены запятыми, поскольку позже в сценарии они будут переменными «group_by».

РЕДАКТИРОВАТЬ:

Представьте, что у меня есть макропеременная в моем контроллере.

%LET group_by_variable = VARA VARB;

Затем я делаю ту же процедуру, но заменяю переменную макроса так

PROC SQL;
SELECT NAME INTO: MACRO_VARIABLE
    SEPARATED BY " "
        FROM CONTENTS
            WHERE VARNUM > 1
            AND
            WHERE NAME NOT IN:(&group_by_variable.)
 ;
QUIT;

person Community    schedule 08.11.2018    source источник


Ответы (2)


В обычных операторах SAS вы можете использовать модификатор двоеточия для выполнения операций с усеченными строками.

if  NAME NOT IN: ('VARA' 'VARB')

Но в PROC SQL (а также в операторах WHERE) вы не можете. Поэтому используйте вместо этого оператор EQT.

WHERE NAME NOT EQT 'VARA'

Вы не можете использовать имена переменных с оператором IN. Но похоже, что вы имеете в виду не имена переменных, а фактические строки символов. Поэтому вам нужно добавить кавычки вокруг значений.

Нетрудно добавить кавычки вокруг списка, разделенного пробелами. Вы можете сделать это одним вызовом функции, если между значениями есть ровно один пробел.

"%sysfunc(tranwrd(VARA VARB,%str( )," "))"

Если ваш список имен находится в переменной макроса, используйте compbl(), чтобы убедиться, что есть только один пробел.

%let mylist=%sysfunc(compbl(&mylist));
person Tom    schedule 08.11.2018

Да, вы можете это сделать, у вас просто плохой синтаксис в вашем запросе. Я бы посоветовал поискать руководства по SAS SQL.

Во-первых, у вас может быть только один оператор «где» для каждого оператора «выбрать». Избавьтесь от второго «где» и просто используйте «и».

Во-вторых, отбросьте «:» после оператора «in».

Наконец, добавьте запятые между переменными, которые вы проверяете.

PROC SQL;
    SELECT NAME INTO: MACRO_VARIABLE
        SEPARATED BY " "
            FROM CONTENTS
                WHERE VARNUM > 1
                AND
                NAME NOT IN (VARA, VARB)
;
QUIT;

Если вы не можете добавить запятые, просто попросите SAS добавить запятые за вас, заменив все вхождения символа пробела запятой.

PROC SQL;
    SELECT NAME INTO: MACRO_VARIABLE
        SEPARATED BY " "
            FROM CONTENTS
                WHERE VARNUM > 1
                AND
                NAME NOT IN (
                    %sysfunc(tranwrd(%quote(VARA VARB),%str( ),%str(, )))
                )
;
QUIT;
person Josh Eller    schedule 08.11.2018
comment
Привет, Джош, спасибо за ответ, но я ищу ответ, который либо сказал бы мне, что это возможно без запятой (,), либо невозможно без запятой, я отредактировал свой вопрос, чтобы быть более явным - person ; 08.11.2018
comment
@MattMcilwham Хорошо, тогда вы можете просто заменить пробелы запятыми в строке. Я отредактировал свой ответ, чтобы показать, как это сделать. - person Josh Eller; 08.11.2018