如何在过程中的PL / SQL中的where位置执行条件where子句

时间:2016-05-20 00:44:33

标签: sql oracle plsql

我有一个非常简单的存储过程,我很难做,因为我是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语句?

2 个答案:

答案 0 :(得分:2)

如果我理解正确,那就不难做到。您可以使用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进行比较。

答案 1 :(得分:0)

你好想到这个我们也可以使用Dynamic 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;