[英]How to do a conditional where clause with where in PL/SQL within Procedure
我有一個非常簡單的存儲過程,因為我不熟悉SQL和PL / SQL,所以我很麻煩。 我有一個帶有名稱列的表,該列是varchar(55)。
我發現,如果用戶使用空字符串作為參數執行我的過程,則LIKE語句會帶走TABLE1中的所有行
SELECT *
FROM TABLE1
WHERE COLUMN LIKE VARIABLE || '%'
AND...
因此,我嘗試更改查詢,以便如果使用空字符串傳遞VARIABLE,它仍然可以在where語句中執行其他條件。
SELECT *
FROM TABLE1
WHERE (VARIABLE <> '' AND COLUMN LIKE VARIABLE || '%')
AND...
但是現在無論我以變量('',NULL,'anystring')傳遞到哪里,都不會返回任何行。
我如何建立一個查詢來驗證變量是否不同於空字符串,以及它是否正確執行了變量的LIKE語句?
如果我對您的理解正確,那不是一件難事。 您可以通過CASE WHEN使用條件WHERE子句。 因此,您的查詢將支持不同的方案,如下所示:
SELECT *
FROM TABLE1
WHERE (CASE WHEN variable IS NULL AND column IS NULL THEN 1
WHEN variable LIKE '%' AND column LIKE variable||'%' THEN 1
ELSE 0
END) = 1
AND...
基本上,它檢查variable = ''
然后將列與''
相比較。 否則,它將與variable||'%'
進行比較。
注意,Oracle將VARCHAR類型的空字符串視為NULL(這不適用於CHAR)。 因此,在第一種情況下,我們將其與NULL進行比較。
您好對此,我們也可以使用動態sql。 如果您可以嘗試這種方法。 希望能幫助到你。
CREATE OR REPLACE PROCEDURE SPS_TEST_OUT(
p_input_in IN VARCHAR2
)
AS
lv_sql LONG;
lv_where VARCHAR2(100);
BEGIN
lv_where:= CASE WHEN p_input_in IS NULL OR p_input_in = '' THEN
''
ELSE
' AND COLUMN1 LIKE '''||p_input_in||'''%'
END;
lv_sql:='SELECT * FROM TABLE
WHERE 1 = 1
' ||lv_where;
dbms_output.put_line(lv_sql);
END;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.