【问题标题】:Wildcard to select all results in a where statement?通配符选择where语句中的所有结果?
【发布时间】:2021-01-15 15:27:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: sas proc-sql


    【解决方案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;
    

    【讨论】:

    • 我希望有通配符与 proc sql 兼容,但听起来这可能是最好的解决方案。您能否验证我是否需要将我的 PROC SQL 语句放入宏中才能使其工作?
    • 取决于您的 SAS 版本。开放代码现在支持像这个例子这样简单的 %IF/%THEN/%DO 块。
    【解决方案2】:

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

    给定:

    %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
    

    如果任一条件被遗漏,则所有行都会筛选出相应的谓词。

    【讨论】:

    • value-if-set 到底是什么?似乎与 PROC SQL 代码无关。
    • 我们的目标是提出一种通用的不同方法来处理整个谓词。你是对的,这不是有效的 PROC SQL - 因此强调“伪代码”。
    • 我正在使用 SAS Enterprise Guide 连接到我认为是 Linux 编码的数据库。我遵循您的建议:定义整个谓词-我以前采用过类似的方法-但是您能解释一下“否则”位吗?我不明白?: 1
    • @bhbennett3,为了清楚起见,我已经修改了我的答案。我不熟悉 PROC SQL,但我想相信有指令可以动态组合查询。如果尚未完全设置相应的条件,则“else 1”位仅允许所有行过滤谓词。对于某些数据库引擎,“通过”值为“真”。
    猜你喜欢
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多