我有一个非常简单的存储过程,因为我对SQL和PL/SQL都是新手,所以我遇到了麻烦。我有一个表,其名称列是varchar(55)。
我发现,如果用户以空字符串作为参数执行我的过程,则类似的语句将从TABLE1中获取所有行。
SELECT *
FROM TABLE1
WHERE COLUMN LIKE VARIABLE || '%'
AND...因此,我尝试更改查询,以便如果使用空字符串传递变量,它仍然可以在where语句中执行其他条件。
SELECT *
FROM TABLE1
WHERE (VARIABLE <> '' AND COLUMN LIKE VARIABLE || '%')
AND...但是现在无论作为变量传递到哪里(‘、NULL、'anystring'),我都不会得到任何返回的行。
如何构建一个查询来验证变量是否与空字符串不同,如果它正确地对变量执行类似的语句?
发布于 2016-05-20 02:07:39
如果我对你的理解是正确的,那就不难做了。您可以使用案例时使用条件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。
发布于 2016-05-20 09:39:31
你好,这只是一个想法,我们也可以使用动态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;https://stackoverflow.com/questions/37336246
复制相似问题