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;
我正在尝试根据外部 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;