繁体   English   中英

用大于、小于或等于参数化 SQL 语句

[英]To parameterize a SQL statement with greater than, less than or equal to

我有一份 SQL 报告。 我想给它传递一个新参数,这个参数应该决定在 3 个输出以下。

select * 来自 po_distributions_all:

encumbered_amount 是其中一列。

参数值 = P,返回所有 encumbered_amount 值 > 零的行

参数值 = N,返回所有 encumbered_amount 值 < 零。

参数值 = E,返回所有不等于零的 encumbered_amount 值

参数为空白,返回所有行。

我知道我可以通过联合查询来实现这一点。

有没有办法我可以在没有工会的情况下实现目标?

查询已经很长了。 为了这个问题的简单性,我在上面将其作为单行查询提到。

您可以在 where 子句中这样做:

WHERE
  (( :parameter = 'P' AND encumbered_amount > 0 ) OR
   ( :parameter = 'N' AND encumbered_amount < 0 ) OR
   ( :parameter = 'E' AND encumbered_amount != 0 ) OR
   ( :parameter IS NULL )
  )

动态SQL呢?

   sqlstr VARCAR2(1000);
   cur SYS_REFCURSOR;
BEGIN
   sqlstr := 'select * from po_distributions_all';
   IF Parameter = 'P' THEN
      sqlstr := sqlstr || ' WHERE encumbered_amount > 0';
   ELSEIF Parameter = 'N' THEN
      sqlstr := sqlstr || ' WHERE encumbered_amount < 0';
   ELSEIF Parameter = 'E' THEN
      sqlstr := sqlstr || ' WHERE encumbered_amount <> 0';
   ELSEIF Parameter IS NULL THEN
      NULL;
   ELSE
      RAISE VALUE_ERROR;
   END IF;

   OPEN cur FOR sqlstr;
   ...
END;

CASE表达式怎么样? 如果没有E选项可能会更简单:)

这是一个 SQL*Plus 示例; 根据您使用的工具,其'&&parameter'替换变量可能是:parameter或其他。

SQL> WITH
  2     po_distributions_all (encumbered_amount)
  3     AS
  4        (SELECT -200 FROM DUAL
  5         UNION ALL
  6         SELECT 100 FROM DUAL
  7         UNION ALL
  8         SELECT 0 FROM DUAL)
  9  SELECT *
 10    FROM po_distributions_all
 11   WHERE (   CASE
 12                WHEN    '&&parameter' <> 'E'
 13                     OR '&&parameter' IS NULL
 14                THEN
 15                   SIGN (encumbered_amount)
 16             END =
 17             CASE
 18                WHEN '&&parameter' = 'P' THEN 1
 19                WHEN '&&parameter' = 'N' THEN -1
 20                WHEN '&&parameter' IS NULL THEN SIGN (encumbered_amount)
 21             END
 22          OR CASE WHEN '&&parameter' = 'E' THEN encumbered_amount END <> 0);
Enter value for parameter: P

ENCUMBERED_AMOUNT
-----------------
              100

负值:

SQL> UNDEFINE PARAMETER
SQL> /
Enter value for parameter: N

ENCUMBERED_AMOUNT
-----------------
             -200

除零以外的所有值:

SQL> UNDEFINE PARAMETER
SQL> /
Enter value for parameter: E

ENCUMBERED_AMOUNT
-----------------
             -200
              100

所有值(参数值为NULL ):

SQL> UNDEFINE PARAMETER
SQL> /
Enter value for parameter:

ENCUMBERED_AMOUNT
-----------------
             -200
              100
                0

SQL>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM