select 的通配符会导致 where 语句?

Wildcard to select all results in a where statement?

我有一个参数化查询,其中包含为 WHERE 子句指定的各种条件,由宏变量设置:

%LET criteria1 = 'XXXX';
%LET criteria2 = 'YYYY';

是否可以使用通配符从根本上删除第二个变量的条件?

PROC SQL;
   SELECT *
   FROM Table
   WHERE
      Field1 IN (&criteria1.)
        AND Field2 IN (&criteria2.)
;QUIT;

我根本不希望用户自己更改查询,但在参数化时可以选择绕过第二个过滤器。

一个选择是重新制定您的方法并参数化整个谓词,以及引入一种默认值机制。我将用伪代码起草我的提案。

鉴于:

%LET criteria1 = 'XXXX';
%LET criteria2 = 'YYYY';

您的查询将类似于(注意伪语法:is_defined(...) ? {predicate} else {pass_through} ):

SELECT *
    FROM Table
    WHERE
        is_defined(&criteria1) ? Field1 IN (&criteria1) else 1=1
            AND is_defined(&criteria2) ? Field2 IN (&criteria2) else 1=1

如果遗漏任何一个条件,则所有行都会针对相应的谓词进行过滤。

您将需要添加一些代码生成逻辑。首先确定要使用的特殊值,例如 ALL,或者只测试参数是否为空。然后你可以使用宏代码有条件地将子句添加到 WHERE.

PROC SQL;
SELECT *
   FROM Table
   WHERE 1=1
%if (%length(&criteria1) and "&criteria1" ne "ALL") %then %do;
     AND Field1 IN (&criteria1.)
%end;
%if (%length(&criteria2) and "&criteria2" ne "ALL") %then %do;
     AND Field2 IN (&criteria2.)
%end;
;
QUIT;