首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nvl,Where,IN子句

nvl,Where,IN子句
EN

Stack Overflow用户
提问于 2016-06-29 18:01:18
回答 4查看 246关注 0票数 0

这是正确的吗?

代码语言:javascript
复制
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将位于a中。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-06-29 18:12:04

我想要在t1.a或t1.b中有“Apple”id的所有行

不,这不对。

您的查询将得到行,其中t1.at2中的idt1.anullt1.bt2中的id

你想:

代码语言:javascript
复制
select *
from   t1
where  EXISTS ( select 1
                from   t2
                where  name = 'Apple'
                and    ( t1.a = t2.id OR t1.b = t2.id ) )

或者:

代码语言:javascript
复制
SELECT *
FROM   t1
WHERE  a IN ( SELECT id FROM t2 WHERE name = 'Apple' )
OR     b IN ( SELECT id FROM t2 WHERE name = 'Apple' )

或者(如果需要在非匹配值中强制执行NULL ):

代码语言:javascript
复制
select *
from   t1
where  EXISTS ( select 1
                from   t2
                where  name = 'Apple'
                and    (  ( t1.a = t2.id AND t1.b IS NULL )
                       OR ( t1.b = t2.id AND t1.a IS NULL ) ) )
票数 2
EN

Stack Overflow用户

发布于 2016-06-29 18:16:25

这是对的,但效率很低。我会写

代码语言:javascript
复制
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')
票数 1
EN

Stack Overflow用户

发布于 2016-06-29 18:26:06

如果一条记录中的a和b的值为-9999和苹果的ID,则查询将不返回该记录,因为a不是null,而so -9999将与apple id而不是b的值进行比较。

我建议这样做,假设你在t2中只有一张代表“苹果”的记录

代码语言:javascript
复制
select *
from   t1
where (select id from t2 where name = 'Apple') in (a, b)

如果您可以在t2中有多个名为"Apple“的记录,那么我建议如下:

代码语言:javascript
复制
select     distinct t1.*
from       t1
inner join t2 
        on t2.name = 'Apple'
       and t2.id in (t1.a, t1.b)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38106969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档