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