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;
我有一个参数化查询,其中包含为 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;