2010-11-04 7 views
17

Jak sprawdzić, czy dany element istnieje w tabeli - jak mogę zwrócić wartość true lub false?Oracle sql zwraca wartość true, jeśli istnieje pytanie

Mam tabeli, która ma

  • user_id
  • user_password
  • user_secretQ

wysławianiu, chcę to zrobić: Jeśli dana user_id istnieje w kolumnie user_id, a następnie return true - w przeciwnym razie zwraca false.

+0

Pożądany STRING wyjście "TAK" lub "NIE" I user_id jest numeryczna – Matt

+0

Jeśli chcesz powrócić ciąg znaków, a następnie edytować swoje pytanie zgodnie do tego. Ciąg znaków oznaczający "TAK" lub "NIE" nie jest tym samym, co powracająca prawda lub fałsz, która byłaby wartością logiczną. – Pere

Odpowiedz

38

W Oracle SQL nie ma typu Boolean. Trzeba będzie wrócić 1 lub 0, lub coś w tym rodzaju i działać odpowiednio:

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

Czy to powoduje błąd? Czy instrukcja select działa w zwykłym starym SQL * Plus? – DCookie

+0

Lub "SELECT NVL2 (MAX (ID_użytkownika)," TAK "," NIE ") ..." – Rubio

8

w PL/SQL można to zrobić:

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; 

To będzie następnie wykorzystywane w wywołanie PL/SQL tak:

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

UWAGA: Kiedyś count (*) w zapytaniu, wiedząc, że będzie to tylko powrót 1 lub 0 w przypadku pierwotnego poszukiwaniu kluczy. Gdyby mógł tam być więcej niż jeden wiersz to bym dodać „i rownum = 1” do kwerendy do uniknięcia niepotrzebnego liczenia wiele rekordów tylko aby dowiedzieć się, jeśli w ogóle istnieje:

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 nie ma logiczną typ danych , możesz używać zmiennych boolowskich tylko w PL/SQL.

Jeśli chcesz po prostu wrócić ciągi 'true' i 'false' można to zrobić ..

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') 

lubię @ zapytania DCookie za choć.

2

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

3

Albo można to zrobić:

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

"Ciąg" z "FALSE" lub "TRUE", ponieważ treść nie jest wartością "Boolean". – Pere