【问题标题】:SAS Contains All CodeSAS 包含所有代码
【发布时间】:2016-12-03 00:03:50
【问题描述】:

可以使用 SAS (Proc SQL) 下载大数据。

有时我需要查看一个特定的客户编号或几个客户编号,并且同样经常需要查看每个客户编号。

我想设置一个宏变量,以便用户可以输入他们需要的客户编号,或者可以输入一些包含所有内容的简短版本。

即%Let dCustomer_Number = in (3123, 1234) 其中 &dCustomer_Number 将位于查询的 WHERE 部分。

一位同事告诉我,在 SQL 中,您可以使用 *(星号)来包含每个客户编号。

我遇到的最接近的是“%”,但这似乎不适用于数值变量。有没有类似的方法可以使用?

我知道删除客户编号过滤器的 where 语句可能很容易,但我不希望用户实际更改代码,只需要更改开头的宏变量。

谢谢

【问题讨论】:

  • 我收到错误:使用 where customer_number = like '%' 时,Like 运算符需要字符操作数
  • 即使 customer_number 是数字,你仍然可以通过将 customer_number 转换为字符来使用 like '%',例如:proc sql; select * from have where put(customer_number,4.) like '3%';退出;它将选择 customer_number 以 3 开头的所有客户。

标签: sql database sas


【解决方案1】:

根据客户编号列表是否为空,生成不同的 where 子句。通常你可以使用一个明显正确的表达式,例如1=1,添加到你的 WHERE 子句中,这样你的完整语句语法就不会改变。

如果您不使用宏,您可以使用IFC() 函数有条件地生成您的 where 子句

%*let dCustomer_Number = 3123,1234 ;
%let dCustomer_Number = ;
%let where_clause = %sysfunc(ifc
   (%length(&dCustomer_Number)
  ,(Customer_Number in (&dCustomer_Number))
  ,(1=1)
));
...
where &where_clause;

【讨论】:

  • 我认为只是 %let dCustomer_Number = ;是我需要的。这似乎带来了一切,然后可以在必要时针对特定的客户编号进行更改。谢谢。
  • 当然。任何产生有效语法并选择您需要的结果的东西。
猜你喜欢
  • 1970-01-01
  • 2020-06-16
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多