2010-11-04 1095 views
17

如何檢查表中是否存在特定元素 - 如何返回true或false?Oracle sql如果存在,則返回true問題

我有了一臺

  • USER_ID
  • USER_PASSWORD
  • user_secretQ

口頭上,我想這樣做:如果存在於user_id列的特定user_id,然後返回true - 否則返回false。

+0

期望輸出字符串「YES」或「NO」 而user_id是數字小 – Matt 2010-11-04 16:28:51

+0

如果你想返回一個字符串,然後編輯根據您的問題對此。說「YES」或「NO」的字符串與返回true或false不同,這將是一個布爾值。 – Pere 2017-11-21 12:33:39

回答

38

Oracle SQL中沒有布爾類型。您將需要返回1或0,或一些這樣和採取相應的行動:

SELECT CASE WHEN MAX(user_id) IS NULL THEN 'NO' ELSE 'YES' END User_exists 
    FROM user_id_table 
WHERE user_id = 'some_user'; 
+0

它是否引發錯誤?您的select語句是否在普通的舊SQL * Plus中工作? – DCookie 2010-11-04 17:48:14

+0

或者'SELECT NVL2(MAX(user_ID),'YES','NO')...' – Rubio 2017-12-18 14:09:11

8

在PL/SQL,你可以這樣做:

function user_exists (p_user_id users.user_id%type) return boolean 
is 
    l_count integer; 
begin 
    select count(*) 
    into l_count 
    from users 
    where user_id = p_user_id; 

    return (l_count > 0); 
end; 

這將隨後在調用PL/SQL中使用像這樣:

if user_exists('john') then 
    dbms_output.put_Line('John exists'); 
end if; 

注:我用在查詢COUNT(*)的知識,這將只在主鍵搜索的情況下返回1或0。如果可以有多個行,然後我想補充「和ROWNUM = 1」來查詢,以防止不必要的計數多條記錄,只是找出如果存在:

function user_has_messages (p_user_id users.user_id%type) return boolean 
is 
    l_count integer; 
begin 
    select count(*) 
    into l_count 
    from messages 
    where user_id = p_user_id 
    AND ROWNUM = 1; 

    return (l_count > 0); 
end; 
7

的Oracle RDBMS沒有布爾數據類型,你只能在PL/SQL中使用布爾變量。

如果你只是想返回字符串 'TRUE' 和 'FALSE' 你可以做到這一點..

SELECT 'TRUE' FROM DUAL WHERE EXISTS (SELECT 'x' FROM table WHERE user_id = 'id') 
UNION 
SELECT 'FALSE' FROM DUAL WHERE NOT EXISTS (SELECT 'x' FROM table WHERE user_id = 'id') 

我喜歡@ DCookie的查詢,但。

2

select count(*) from table where userid = :userid and rownum <= 1); -- If exists then 1 else 0

3

或者你可以這樣做:

select decode(max(USER_ID), null, 'FALSE', 'TRUE') BOOL_VAL 
from USER_TABLE where USER_ID = [some USER_ID here] 
+0

由於內容不是布爾值,所以帶有「FALSE」或「TRUE」的字符串。 – Pere 2017-11-21 12:31:37

相關問題