我正在尝试根据外部表中包含的值创建一个宏变量。我目前正在使用此
: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
;
这将允许我在源表为空时填充变量,但在使用数据更新后使用最大日期。
答案 0 :(得分:2)
只需在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;
答案 1 :(得分:0)
好的,我知道了。 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
;