Oracle SQL如果存在则返回true的问题

24

如何检查表中是否存在特定元素 - 如何返回 true 或 false?

我有一个包含以下内容的表:

  • user_id
  • user_password
  • user_secretQ

简单来说,我想这样做:如果某个特定的 user_id 存在于 user_id 列中,则返回 true - 否则返回 false。


期望输出字符串为“是”或“否”,而用户ID是数字。 - Matt
如果你想返回一个字符串,那么请根据此编辑你的问题。一个写着“YES”或“NO”的字符串并不等同于返回true或false,后者是布尔类型。 - Pere
5个回答

53

Oracle SQL 中没有 Boolean 类型。您需要返回 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';

它是否抛出了错误?你的选择语句在普通的SQL*Plus中是否有效? - DCookie
1
或者 SELECT NVL2(MAX(user_ID),'YES','NO') ... - Rubio

11

在 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。如果可能存在多行,则我会在查询中添加“and 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;

9

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 的查询语句。


TIL布尔值不是DDL的一部分。 - Salvador Valencia

4

选取从表中userid = :userid的数据行,并且只返回一行。如果存在则返回1,否则返回0。


3
或者你可以这样做:
select decode(max(USER_ID), null, 'FALSE', 'TRUE') BOOL_VAL
from USER_TABLE where USER_ID = [some USER_ID here]

一个以“FALSE”或“TRUE”为内容的字符串并不是一个布尔值。 - Pere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接