【问题标题】:IF statement to create macro variableIF 语句创建宏变量
【发布时间】:2018-10-08 14:22:44
【问题描述】:

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

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
;

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

【问题讨论】:

  • SQL 使用 CASE 语句参见文档。
  • 压缩时的情况("'" || put(MAX(CALL_DATE)+1 , DATE9.)|| "'") ='.'然后 '10oct2018' else compress("'" || put(MAX(CALL_DATE)+1 , DATE9.)|| "'") end 虽然它没有错误但不会评估我的想法。

标签: sql if-statement sas sas-macro


【解决方案1】:

只需测试原始值而不是 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;

【讨论】:

  • 这行得通!我以前从未见过报价功能。从我收集的内容来看,它添加了双“,然后看起来它正在将其更改为单引号。我硬编码日期的原因与我设置的日程安排有关。我有一个空白表设置,然后安排运行某个日期。这比我在下面提到的解决方案更干净,我学到了一个新功能。谢谢。
【解决方案2】:

好的,我想通了。 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
;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2015-07-26
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多