将ORACLE代码段组合成条件语句

时间:2011-09-05 10:23:54

标签: sql oracle conditional

我们公司有一个会员卡数据库。该卡系统由全国两种类型的终端服务。麻烦的是,两个终端以不同的方式计算当前的点平衡。

我想创建一个查询,首先按日期查找单个用户的事务列表的最后一行,然后检查终端的ID,并根据ID,从同一行返回卡余额。 / p>

这两种类型的终端可以这样表达:

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

AGHUPR9%只能从名为 card_balance 的列中获得余额。 AGHUPR7%需要求和 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开头的terminal_id,执行此操作

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

如果第一个语句返回以AGHUPR7开头的terminal_id,执行此操作

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

如何将它们组合成一个有效的查询?我试图使用 CASE 但收效甚微。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

只需使用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以“AGHUPR9”开头时,这将使用terminal_id,否则它将使用card_balance+total_points,在任何一种情况下都会在名为“card_balance”的列中返回答案。< / p>