IF语句创建宏变量

IF statement to create macro variable

我正在尝试根据外部 table 中包含的值创建一个宏变量。我目前正在使用这个:

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

这为我提供了我的 table 的最大日期为“10OCT2018” 问题是,当我最初 运行 时,我的来源 table 将没有最大值,因为它将是空白的,因此它的计算结果为“。” 我想做类似的事情:

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
;

这将允许我在源 table 为空时填充变量,然后在使用数据更新后使用最大日期。

好的,我明白了。 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
;

只需测试原始值而不是 WHEN 子句中的格式化值。不要硬编码默认日期,而是使用 today() 函数获取一个值,以便在 max() 值缺失时使用(或 SQL 中的 null)。 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;