首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >case语句select

case语句select
EN

Stack Overflow用户
提问于 2018-10-24 02:21:25
回答 3查看 85关注 0票数 0
代码语言:javascript
复制
|AMNT1   |  AMNT2 |  Rank
__________________________
|  01    |      05 |     rank1   
|  05    |     10 |  rank2   
| 10     |     15 |  rank3  
___________________________

我需要提供输出rank1,rank2,rank3 when值之间的case语句

1 and 5 rank1、5 and 10 rank2等

我有一个金额表,其中包含deptid和amount

需要的输出是deptid amount rank,其中rank需要从rank表中提取

如何编写select查询并将其放到case语句中?

它应该是动态的(我的意思是表值可以改变,但我的case语句应该读取最新的值并提供输出)

EN

回答 3

Stack Overflow用户

发布于 2018-10-24 02:23:51

你不需要case。您可以使用相关子查询:

代码语言:javascript
复制
select (select rt.rank from ranktable rt where a.amount >= rt.amnt1 and a.amount < rt.amnt2) as ranking
from amount a;

您也可以以join的身份执行此操作。

票数 1
EN

Stack Overflow用户

发布于 2018-10-24 03:20:02

您是否在寻找下面的case语句:

代码语言:javascript
复制
select * from (select case when input_amt>AMNT1 and input_amt<AMNT2 THEN rank end  RANK
from ranktable) rnk
where rnk.RANK is not null
票数 0
EN

Stack Overflow用户

发布于 2018-10-26 02:30:57

下面是一个连接版本,其中包含CTE格式的示例数据:

代码语言:javascript
复制
with rankings (amnt1, amnt2, rank) as (
            select 1, 5, 'rank1' from dual
  union all select 5, 10, 'rank2' from dual
  union all select 10, 15, 'rank3' from dual
),
amount (deptid, amount) as (
            select 1, 0 from dual
  union all select 2, 1 from dual
  union all select 3, 4 from dual
  union all select 4, 5 from dual
  union all select 5, 6 from dual
  union all select 6, 9 from dual
  union all select 7, 10 from dual
  union all select 8, 11 from dual
  union all select 9, 15 from dual
  union all select 10, 16 from dual
)
-- actual query
select a.deptid, a.amount, r.rank
from amount a
left join rankings r on a.amount >= r.amnt1 and a.amount < r.amnt2;

这将得到与戈登的子查询方法相同的结果:

代码语言:javascript
复制
    DEPTID     AMOUNT RANK 
---------- ---------- -----
         1          0      
         2          1 rank1
         3          4 rank1
         4          5 rank2
         5          6 rank2
         6          9 rank2
         7         10 rank3
         8         11 rank3
         9         15      
        10         16      

如您所见,使用这些比较条件意味着不存在与15匹配的u1。您可以更改它们:

代码语言:javascript
复制
select a.deptid, a.amount, r.rank
from amount a
left join rankings r on a.amount > r.amnt1 and a.amount <= r.amnt2;

    DEPTID     AMOUNT RANK 
---------- ---------- -----
         1          0      
         2          1      
         3          4 rank1
         4          5 rank1
         5          6 rank2
         6          9 rank2
         7         10 rank2
         8         11 rank3
         9         15 rank3
        10         16      

但是现在没有1的匹配项。如果您尝试用between的等价物同时获得这两个

代码语言:javascript
复制
select a.deptid, a.amount, r.rank
from amount a
left join rankings r on a.amount >= r.amnt1 and a.amount <= r.amnt2;

    DEPTID     AMOUNT RANK 
---------- ---------- -----
         1          0      
         2          1 rank1
         3          4 rank1
         4          5 rank1
         4          5 rank2
         5          6 rank2
         6          9 rank2
         7         10 rank2
         7         10 rank3
         8         11 rank3
         9         15 rank3
        10         16      

由于行重叠,您现在可以获得多个结果。例如,当有多个匹配时,你可以通过保持“更高”的排名来摆脱它们:

代码语言:javascript
复制
select a.deptid, a.amount,
  max(r.rank) keep (dense_rank last order by r.amnt1) as rank
from amount a
left join rankings r on a.amount >= r.amnt1 and a.amount <= r.amnt2
group by a.deptid, a.amount;

    DEPTID     AMOUNT RANK 
---------- ---------- -----
         1          0      
         2          1 rank1
         3          4 rank1
         4          5 rank2
         5          6 rank2
         6          9 rank2
         7         10 rank3
         8         11 rank3
         9         15 rank3
        10         16      

但是,实际上,你要么不应该有重叠;要么你需要定义哪个结果是正确的。(如果您的数据总是与某些内容匹配,那么您甚至可能根本不需要/想要一个下限;但这也是一个稍有不同的查询。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52955499

复制
相关文章

相似问题

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