当我想写像
这样的东西时,我常常陷入困境IF v_shortname IN (SELECT sname FROM table)
OR
IF EXISTS (SELECT sname FROM mmstrephdr
WHERE sname= v_short)
我知道EXISTS和IN不能以这种方式工作。也可以随时调整我的代码来获得这样的结果,但我总是想知道SQL中是否有一个编程结构可以帮我完成工作!
答案 0 :(得分:0)
如果您摆脱了IF
前缀,IN()
和EXISTS()
以这种方式工作。
首先,使用IN()
的版本通常是Bad Idea™ - 性能方面,在WHERE子句中使用JOIN或派生表而不是子查询要好得多。
-- instead of:
SELECT * FROM tbl1 WHERE tbl1.v_short IN (SELECT tbl2.sname FROM tbl2)
-- you would want something like:
SELECT tbl1.* FROM tbl1 JOIN tbl2 ON (tbl2.sname = tbl1.v_short)
另一方面, EXISTS()
非常有用。它被优化为与INNER JOIN相同,而NOT EXISTS()
与带有IS NULL检查的LEFT JOIN相同。 [NOT] EXISTS()
版本更容易阅读,就好像它是英文版一样。请注意,将列列表传递给EXISTS中的SELECT是没有意义的 - 它没有被使用,它每次都被优化为SELECT *。
-- easy to read:
SELECT * FROM tbl1 WHERE EXISTS (SELECT * FROM tbl2 WHERE tbl2.sname = tbl1.v_short)
-- same thing, just more SQL-like than English-like:
SELECT tbl1.* FROM tbl1 JOIN tbl2 ON (tbl2.sname = tbl1.v_short)
答案 1 :(得分:0)
你为何陷入困境? PL / SQL提供了允许我们实现该逻辑的结构。
declare
.....
function name_exists (p_sname table_a.sname%type)
return boolean
is
l_shortname table_a.sname%type;
begin
SELECT sname
FROM table_a
where sname = p_sname;
return true;
exception
when no_data_found then
return false;
end name_exists;
....
begin
....
if name_exists ('KNOX') then
还有其他方法可以做到这一点,但我喜欢嵌套函数的封装。