nvl,Where,IN子句

时间:2016-06-29 18:01:19

标签: sql oracle

这是对的吗?

select * from t1
where nvl(t1.a,t1.b) in (select id from t2 where name = 'Apple')

a,b是t1中来自t2的Id的列。

我希望在t1.a或t1.b

中所有具有“Apple”ID的行

如果a为null,则id将在b中。

如果b为null,则id将位于。

4 个答案:

答案 0 :(得分:2)

  

我希望在t1.a或t1.b

中所有具有“Apple”ID的行

不,这不正确。

您的查询将在t1.aidt2t1.anull时获取t1.bid的行{1}}中的{1}}。

你想:

t2

或:

select *
from   t1
where  EXISTS ( select 1
                from   t2
                where  name = 'Apple'
                and    ( t1.a = t2.id OR t1.b = t2.id ) )

或(如果您需要在非匹配值中强制执行SELECT * FROM t1 WHERE a IN ( SELECT id FROM t2 WHERE name = 'Apple' ) OR b IN ( SELECT id FROM t2 WHERE name = 'Apple' ) ):

NULL

答案 1 :(得分:1)

这是正确的,但效率低下。 我会写

select * from t1
where t1.a in (select id from t2 where name = 'Apple')
union 
select * from t1
where t1.b in (select id from t2 where name = 'Apple')

答案 2 :(得分:0)

如果一条记录中 a b 的值为-9999且app为id,则查询不会返回记录,因为 a < / em>不为null,因此将-9999与苹果ID进行比较,而不是 b 的值

我建议这一点,假设您在 t2 中只有一条代表“Apple”的记录

if (cognitoUser != null) {
     alert(cognitoUser.getUsername());
}

如果您可以在 t2 中创建名为“Apple”的多条记录,那么我会建议:

select *
from   t1
where (select id from t2 where name = 'Apple') in (a, b)

答案 3 :(得分:0)

您的问题在评论中描述 - 问题中的逻辑不正确,因为值可能是-9999。你可以做你想做的事情:

UseDefaultCredentials