Оператор IF для создания макропеременной - PullRequest
0 голосов
/ 08 октября 2018

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

PROC SQL NOPRINT;
SELECT compress("'" || put(MAX(CALL_DATE)+1 , DATE9.)|| "'")
into :start_date 
FROM table.test
;

Это дает мне максимальную дату из моей таблицы как «10OCT2018». Проблема заключается в том, что при первоначальном запуске этой исходной таблицы не будет иметь максимальное значение, как это будетбыть пустым, поэтому он оценивается как '.'Я хотел бы сделать что-то вроде:

PROC SQL NOPRINT;
SELECT IF compress("'" || put(MAX(CALL_DATE)+1 , DATE9.)|| "'") ='.' THEN 
'10OCT2018' ELSE compress("'" || put(MAX(CALL_DATE)+1 , DATE9.)|| "'") END
into :start_date 
FROM table.test
;

Это позволит мне заполнить переменную, когда исходная таблица пуста, но затем использовать максимальную дату после ее обновления данными.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Просто проверьте исходное значение вместо форматированного значения в предложении WHEN.Вместо жесткого кодирования даты по умолчанию используйте функцию today(), чтобы получить значение, которое будет использоваться, когда значение max () отсутствует (или не имеет значения в языке SQL).Функция quote() может добавлять кавычки.

Если значение поступает из удаленной базы данных, используйте вложенный запрос, чтобы сначала создать максимальное значение, а затем отформатировать его.Это гарантирует, что из удаленной базы данных будет извлечено только максимальное значение.

proc sql noprint;
select quote(put(
   case when max_call_date is null then today() else max_call_date+1 end
   ,date9.),"'")
  into :start_date 
  from (select max(call_date) as max_call_date from table.test)
;
quit;
0 голосов
/ 08 октября 2018

хорошо, я понял это.Оператор case нуждался в дополнительных кавычках, поскольку он был в макросе.

PROC SQL NOPRINT;
SELECT case when compress("'" || put(MAX(CALL_DATE)+1 , DATE9.)|| "'") ="'.'" then 
"'10oct2018'" else compress("'" || put(MAX(CALL_DATE)+1 , DATE9.)|| "'") end
into :start_date 
FROM table.test
;
...