2010-11-04 5 views
17

Как проверить, существует ли какой-либо конкретный элемент в таблице - как я могу вернуть true или false?Oracle sql return true if exists question

У меня есть таблица, которая имеет

  • user_id
  • user_password
  • user_secretQ

Устно, я хочу сделать это: Если конкретный user_id существует в user_id колонке, затем return true - в противном случае возвращает false.

+0

Желаемая выход STRING «ДА» или «НЕТ» И user_id является Numberic – Matt

+0

Если вы хотите, чтобы вернуть строку, а затем изменить свой вопрос в соответствии к тому, что. Строка с надписью «YES» или «NO» не совпадает с возвращаемым значением true или false, что будет логическим. – Pere

ответ

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

Это ошибка? Работает ли ваш оператор выбора в простом SQL * Plus? – DCookie

+0

Или 'SELECT NVL2 (MAX (user_ID), 'YES', 'NO') ...' – Rubio

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 не имеет логический тип , вы можете использовать только логические переменные в 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

«String» с «FALSE» или «TRUE» в качестве содержимого не является значением «Boolean». – Pere