如何更改sql查询返回的最后一行中的值?

时间:2011-02-16 16:21:55

标签: sql oracle

我在编写SQL查询时遇到问题,该查询返回在最后返回的行的字段中放置特定值的行(此修改仅对返回的结果进行,不得修改数据库记录)。

以下是一个例子:

SELECT A.a, 
       A.b, 
       A.c
  FROM A
 WHERE A.b = 10

结果返回:

A.a |A.b |A.c
--------------
1    10   zaza
2    10   zozo
3    10   zuzu
4    10   zozo

我希望请求自动将特定值放在最后一行的A.c字段中,例如:

A.a |A.b |A.c
--------------
1    10   zaza
2    10   zozo
3    10   zuzu
4    10   XXXX

3 个答案:

答案 0 :(得分:2)

如果行的顺序由列a确定,则以下内容将替换“最后”行中的C - 值。

select a
      ,b
      ,case when row_number() over(order by a) = count(*) over() then 'XXX' 
                                                                 else c end as c
  from v
order by a;   

答案 1 :(得分:0)

首先,您需要一个ORDER BY语句。 Oracle不保证按输入顺序返回行,因此您需要将SQL更改为:

select A.a, A.b, A.c
From A
Where A.b = 10
ORDER BY A.a;

对于“最后”行的概念具有任何意义。

这是一种方式......可能有更好的方式来做这件事......

SELECT A, B, C
FROM (
SELECT A.A, A.B, A.C
FROM   A
WHERE  A.A <> (SELECT MAX(A.A) FROM A WHERE A.B = 10)
AND    A.B = 10 
UNION ALL
SELECT A.A, A.B, 'whatever'
FROM   A
WHERE  A.A = (SELECT MAX(A.A) FROM A WHERE A.B = 10)
AND    A.B = 10
)
ORDER BY A.A

如果有两行,其中A.A是相同的(如果可能的话?)

,你没有说出应该是什么行为?

答案 2 :(得分:0)

不那么凌乱:

SELECT A,
       B,
       CASE
         WHEN A = (SELECT MAX(A) FROM TEST WHERE B = 10) THEN 'XXXX'
         ELSE C
       END C
FROM TEST