Объединение фрагментов ORACLE в условный оператор - PullRequest
0 голосов
/ 05 сентября 2011

У нас есть база данных карт лояльности в моей компании. Система карт обслуживается двумя типами терминалов по всей стране. Проблема в том, что два терминала по-разному подсчитывают баланс текущей точки.

Я хочу сделать запрос, который сначала находит последнюю строку списка транзакций одного пользователя по дате, затем проверяет идентификатор терминала и на основе идентификатора возвращает баланс карты из той же строки.

Два типа терминалов можно выразить так:

terminal_id LIKE 'AGHUPR9%'
terminal_id LIKE 'AGHUPR7%'

AGHUPR9% получают баланс просто из столбца card_balance . AGHUPR7% из них необходимо sum card_balance и total_points , чтобы получить текущий баланс.

Я написал основные части запроса, но я недостаточно знаком с ORACLE, поэтому не знаю, как их объединить синтаксически. Это то, что я буду признателен за вашу помощь. Ниже приводится то, что я придумал, с комментариями, в которых я не уверен насчет необходимого кода.

SELECT *
FROM
(SELECT terminal_id
FROM ag_tranzakcio
WHERE cardnumber = '9348722610095185'
ORDER BY tran_date DESC)
WHERE ROWNUM = 1

В случае вышеприведенный оператор возвращает терминал_ид, начиная с AGHUPR9, сделать это :

SELECT *
FROM
(SELECT card_balance
FROM ag_tranzakcio
WHERE cardnumber = '9348722610095185'
ORDER BY tran_date DESC)
WHERE ROWNUM = 1

В случае первый оператор возвращает терминал_ид, начинающийся с AGHUPR7, вместо этого делают :

SELECT *
FROM
(SELECT card_balance+total_points
FROM ag_tranzakcio
WHERE cardnumber = '9348722610095185'
ORDER BY tran_date DESC)
WHERE ROWNUM = 1

Как мне объединить их в рабочий запрос? Я пытаюсь использовать CASE без особого успеха.

Заранее спасибо.

1 Ответ

1 голос
/ 05 сентября 2011

Просто используйте оператор CASE.

SELECT *
FROM
(SELECT 
   CASE 
     WHEN terminal_id LIKE 'AGHUPR9%' THEN card_balance 
     ELSE card_balance+total_points 
   END AS card_balance
FROM ag_tranzakcio
WHERE cardnumber = '9348722610095185'
ORDER BY tran_date DESC)
WHERE ROWNUM = 1

Это будет использовать card_balance, когда terminal_id начинается с «AGHUPR9», в противном случае он будет использовать card_balance+total_points, возвращая ответ в столбце с именем «card_balance» в любом случае.

...