[英]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 示例; 根據您使用的工具,其'&¶meter'
替換變量可能是: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 '&¶meter' <> 'E'
13 OR '&¶meter' IS NULL
14 THEN
15 SIGN (encumbered_amount)
16 END =
17 CASE
18 WHEN '&¶meter' = 'P' THEN 1
19 WHEN '&¶meter' = 'N' THEN -1
20 WHEN '&¶meter' IS NULL THEN SIGN (encumbered_amount)
21 END
22 OR CASE WHEN '&¶meter' = '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.