簡體   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