【问题标题】:SAS Case Statement - if this, then that . else leave as isSAS 案例声明 - 如果是这样,那么。否则保持原样
【发布时间】:2019-05-02 20:19:25
【问题描述】:

我有一列包含一些不需要的数据“XX”,并希望将它们设置为 0。否则,请保持该列的数据不变。类似于 if columnA = "XX" then 0 Else columnA.我尝试使用 proc SQL SAS 步骤执行此操作,但这不起作用。因此,寻找使用 SAS SQL 的最有效方法。谢谢你的帮助。

if columnA = "XX" then 0 
Else columnA
End as columnA

【问题讨论】:

    标签: sql if-statement sas case


    【解决方案1】:

    这应该在 proc sql 中工作:

    proc sql;
        select (case when columnA = 'xx' then '0' else columnA end) as columnA
        from t;
    

    请注意,0 是此表达式中的字符串。 columnA 似乎是一个字符串(基于比较)。 case 表达式返回一个具有指定类型的值——在这种情况下,它应该是一个字符串。

    【讨论】:

    • 不知道你为什么在 CASE 语句周围加上括号,但它们应该不会造成任何问题。
    • @tom 。 . .我总是在表达式周围加上括号,包括 case 表达式。
    • 感谢您的帮助。我仍然收到 SAS 错误消息“CASE 表达式没有 ELSE 子句。WHEN 子句未考虑的情况将导致 CASE 表达式的缺失值。”这也可能与 SAS 宏中的代码有关。我将在 Teradata 中使用 case 语句。再次感谢。
    • @BlueBob 。 . .这应该是一个警告,而不是错误,但您始终可以添加一个明确的 else null——尽管这在 SQL 中不是必需的。
    【解决方案2】:

    这是 SQL 中的 CASE 语句。

    Case when columnA='XX' then '0'
         else columnA 
    end as ColumnA_New
    

    原代码: 当 columnA='XX' 然后为 0 时的情况 其他列A 以 ColumnA 结尾

    【讨论】:

    • 我在 SAS 中尝试过。我得到了这个错误。 CASE 表达式没有 ELSE 子句。 WHEN 子句未考虑的情况将导致 CASE 表达式的缺失值。
    • 不是我发布的代码,由于缺少引号,它会出现类型不匹配错误,如果已修复,您会收到有关使用相同名称的警告,但不会显示错误,因此您的代码是不知何故错了。
    • 感谢您的帮助。这也可能与 SAS 宏中的代码有关。我将在 Teradata 中使用 case 语句。再次感谢。
    • 宏不会是问题,但如果您使用的是 SQL Pass through,那么这将是问题。然后 SQL 需要是 Teradata SQL 而不是 SAS SQL。
    【解决方案3】:

    之前的两种解决方案都可以正常工作。确实,在 proc sql 中提出了解决方案,但我发现数据步进方法似乎更简单。为了完整起见,将其发布在这里。

    /*Generate sample data*/
    data begin; 
      input value @@; 
      cards; 
    1 2  3  2.5 1.7 3 34 33 33 33.7 34 34
      ; run;
    
    /*replace value=33 with zeros*/
    data wanted; 
      set begin; 
        if value = 33 then value=0; 
    run;
    

    【讨论】:

      猜你喜欢
      • 2021-09-12
      • 2011-05-01
      • 2016-04-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多