簡體   English   中英

如何在過程中的PL / SQL中的where中執行條件where子句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM