我在编写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
答案 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