Oracle sql join的情况何时

问题描述 投票:1回答:3

我有一个像这样的主要细节情况标题的详细信息:

pk | desc | quantity | fkHeader
1  | AA   | 10       |  1
2  | BB   | -50      |  1
3  | CC   | 25       |  1

我需要首先提取负数量的行然后用正数提取所以我想使用光标并将符号编号('+'o' - ')作为参数传递给它

这样的事情

cursor rec (p_sign in char) is
  select * 
    from details
   where (case when p_sign = '+' then quantity > 0 else quantity < 0 end)

得到这样的东西

(用'+'表示)

1 | AA | 10 | 1
3 | CC | 25 | 1

(用' - '记录)

2 | BB | -50 | 1

但这当然不起作用..不能提取切换参数值的行

有没有办法使用案例作为条件(或JOIN)或我需要两个分开的游标?

谢谢

sql oracle
3个回答
1
投票

您的过程解决方案(传递变量)不是解决此问题的最佳方法,但是要回答有关我在此处编写的过程中包含的SQL的具体问题。同样,对于您的实际问题,最终更好的解决方案是具有正确顺序的单个sql语句。

您无法在案例表达式中返回条件。相反,你需要在这里有点棘手:

WHERE CASE WHEN p_sign='+' THEN quantity ELSE quantity * -1 END < 0

但是如果你在评论中使用@jarlh建议的and / or逻辑会更清楚:

WHERE ((p_sign='+' AND quantity > 0) OR (p_sign<>'+' AND quantity < 0))

1
投票

这对你有用吗?

select * from tbl
order by case when quantity > 0 then 1 else 0 end;

如果你需要它们

select * from tbl where quantity < 0;
select * from tbl where quantity >=0;

你也可以联合他们

select * from tbl where quantity < 0 union
select * from tbl where quantity >=0;

你也可以标记它们

select 
  case when quantity < 0 then '-' else '+' end sign, 
  tbl.* 
from tbl 

然后

select * from 
(
  select 
    case when quantity < 0 then '-' else '+' end sign, 
    tbl.* 
  from tbl 
) 
order by sign 

0
投票

您的基本想法将起作用,您只需使用适当的AND / OR逻辑而不是CASE:

cursor rec (p_sign in char) is
  select * 
    from details
   where (p_sign = '+' AND quantity > 0) OR (p_sign = '-' AND quantity < 0)
© www.soinside.com 2019 - 2024. All rights reserved.