2013-08-19 2 views
1

Я использую макрос в SAS для обработки таблиц данных в конкретной библиотеке. Я помещал информацию метаданных в шаге данных null и делал сравнение с оператором where и моей макропеременной.одинарные значения цитирования с использованием sql для создания макропеременной

Мой SQL шаг выглядит следующим образом:

proc sql; 
    select quote(trim(code)) into :procedures separated by ', ' from procedures; 
quit; 

Некоторые значения code содержат значения, как «45.10» и «G0102», поэтому не может быть принужден к числовым. Макрос содержит строку:

%macro filter_codes(indata, outdata); 
    data &outdata; 
    set &indata(where = (code in (&procedures))); 
    run; 
%mend; 

но десятичные значения создают проблемы при двойных кавычках, используя функцию «кавычки».

Могу ли я отделять значения одинарными кавычками?

EDIT: проблема была вызвана тем, что макрос filter_codes выполнялся на этапе выполнения вызова (по диапазону наборов данных), а двойные кавычки, разрешенные в макропеременных внутри двойных кавычек, завершили бы выполнение вызова.

+0

В коде нет ничего явно неправильного, если только ваши значения не содержат сами кавычки. Разумеется, нет ничего особенного в том, как SAS использует '' 'from' '', за исключением разрешения макропеременной, что не кажется здесь актуальным из вашего вопроса. Простой тест на моей стороне показал, что он работает нормально, используя 'height' from' sashelp.class'. Можете ли вы опубликовать некоторые примеры данных, которые показывают, что это не работает? – Joe

+0

Вы правы, причина, по которой это вызвало ошибку, заключалась в том, что цитируемый текст был разрешен в команде выполнения вызова на этапе _null_. Я изменил вопрос. – AdamO

ответ

6

Попробуйте это:

proc sql; 
    select catt("'", code, "'") into :procedures separated by ', ' from procedures; 
quit; 

исправить также где параметр в множестве утверждения:

set &indata(where=(code in (&procedures))); 
+0

Решение довольно очевидно, хотя и не столь изящно, как команда «quote». Я сделал то же самое по названию 'select ''" || код || "" "в ...". – AdamO

1

Как о в одном шаге с помощью SQL?

 
%macro filter_codes(indata, outdata); 
    proc sql ; 
    create table &OUTDATA as 
    select * from &INDATA 
    where code in(select distinct code from procedures) ; 
    quit ; 
%mend; 

Не нужно беспокоиться о цитировании.

1

В 9.3 у вас есть второй аргумент, позволяющий использовать одинарные кавычки в quote()function.

proc sql noprint; 
select quote(trim(code),"'") into :procedures separated by ', ' from procedures; 

Однако .. Не являюсь вентилятором этой функции, поскольку она заполняет пустые переменные символа одним пространством (см. Ниже).

data _null_; 
    x=''; /* empty */ 
    y=quote(x,"'"); 
    put y=; /* gives y=' ' */ 
run; 

К сожалению, это только «в построенном» способе (кроме экспорта Proc или тому подобного), чтобы получить надежное квотирование применяется (например, со ссылкой на котировки).

0

Устранить проблему, когда вы ссылаетесь на переменную. Похоже, что вы пытаетесь использовать что-то вроде

call execute("set &indata(where=(code in (&procedures)))") ; 

Первого нет необходимости использовать двойные кавычки в вызове EXECUTE строки. Нажимайте на & процедуры в неиспользуемый стек команд.

call execute('set &indata(where=(code in (&procedures)))') ; 

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

put %sysfunc(quote(The procedure list is &procedures)); 
Смежные вопросы