Oracle sql включается в случае, когда - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть ситуация с мастер-деталями, подобная этой. Подробности заголовка:

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)

И получить что-то вроде этого

(rec с '+')

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

(rec с' - ')

2 | BB | -50 | 1

Но это, конечно, не работает .. не удалось извлечьстроки, включающие значение параметра

Есть ли способ использовать регистр как условие (или JOIN) или мне нужны два разделенных курсора?

Спасибо

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Ваше решение процедуры (передача переменной) - не лучший способ решить эту проблему, однако, чтобы ответить на вопросы конкретно о SQL, содержащемся в процедуре, которую я написал здесь.Опять же, в конечном счете, лучшим решением для вашего фактического вопроса является один SQL-оператор с правильным порядком на.

Невозможно вернуть условие в выражении регистра.Вместо этого вам понадобится немного сложнее:

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

Однако было бы понятнее, если бы вы использовали and / or логику, предложенную @jarlh в комментариях:

WHERE ((p_sign='+' AND quantity > 0) OR (p_sign<>'+' AND quantity < 0))
0 голосов
/ 06 февраля 2019

Ваша основная идея будет работать, вы просто используете соответствующую логику И / ИЛИ вместо CASE:

cursor rec (p_sign in char) is
  select * 
    from details
   where (p_sign = '+' AND quantity > 0) OR (p_sign = '-' AND quantity < 0)
0 голосов
/ 06 февраля 2019

Работает ли это для вас?

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...