我常常會被卡住的時候,我想寫成纔像存在,沒有選擇使用,INSERT和UPDATE查詢
IF v_shortname IN (SELECT sname FROM table)
OR
IF EXISTS (SELECT sname FROM mmstrephdr
WHERE sname= v_short)
我知道其存在,並在這種方式行不通。我也可以隨時調整我的代碼來獲得這樣的結果,但是我總是想知道是否有一個SQL中的編程構造可以爲我完成這項工作!
我常常會被卡住的時候,我想寫成纔像存在,沒有選擇使用,INSERT和UPDATE查詢
IF v_shortname IN (SELECT sname FROM table)
OR
IF EXISTS (SELECT sname FROM mmstrephdr
WHERE sname= v_short)
我知道其存在,並在這種方式行不通。我也可以隨時調整我的代碼來獲得這樣的結果,但是我總是想知道是否有一個SQL中的編程構造可以爲我完成這項工作!
如果你擺脫IF
前綴,IN()
和EXISTS()
做工作的方式。
首先,使用IN()
的版本通常是一個糟糕的想法™ - 在性能方面,使用JOIN或派生表而不是WHERE子句中的子查詢更好。
-- 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檢查。 [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)
在你的第一行中,你刪除了「IF」。那是我不想做的。我知道我可以調整和使用輕鬆選擇來獲得結果。但我不明白爲什麼不應該這樣工作。我的意思是直接比較SELECT語句的結果 - 不在SELECT查詢中 - 但在IF條件下。或者如果我談到我上面的第二個查詢,如果我只想知道我的選擇查詢是否返回了某些內容,該怎麼辦?爲什麼我必須編寫'select ... into'語句來檢查結果?我只是想知道這是否有可能? – kushalvm
您的原始問題和後續問題不夠詳盡,無法提供完整答案 - 仍然不知道您真正想要完成的任務。也許你試圖在存儲過程中將這些'IF'測試寫爲條件邏輯而不是正則'SELECT'語句? 在使用'SELECT'語句中'IN'和'EXISTS'的情況下,這兩個已經附加有一個「隱'IF'」。檢查在另一個表中是否包含或存在一個值*是一個條件邏輯測試......您不需要額外的「IF」。 – 2013-07-27 15:48:42
哦,如果你不嘗試選擇任何實際的表中的數據,只是想要一個簡單的是/否的答案是否存在的數據,你還要做一個SELECT(你不能從數據庫中檢索的任何值沒有SELECT)。例如:'SELECT IF(EXISTS(SELECT * FROM tbl1 WHERE),'yes','no')' – 2013-07-27 15:51:31
爲什麼你卡住了? 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
還有其他方法可以做到這一點,但我喜歡封裝的嵌套功能。
你能寫出來的,你是試圖代碼的問題? –
類似的問題:http://stackoverflow.com/questions/24929/difference-between-exists-and-in-in-sql – Verma
@Verma這怎麼是一個類似的問題。再次嘗試讀取我的問題張貼對鏈接的問題 – kushalvm