通配符选择where语句中的所有结果?



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

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

是否有一个通配符可以用来删除第二个变量的标准?

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

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

您将需要添加一些代码生成逻辑。首先决定使用一个特殊的值,比如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;

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

给定:

%LET criteria1 = 'XXXX';
%LET criteria2 = 'YYYY';
您的查询将类似于(注意伪语法:is_defined(…)?{谓词}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

如果省略了任何一个条件,则所有行都过滤出相应的谓词。

最新更新