我有下表:
姓名 |
---|
(空) |
姓名1 |
姓名2 |
姓名 3 |
(空) |
姓名 4 |
我想生成这个输出:
姓名 | 输出 |
---|---|
(空) | 匿名者 |
姓名1 | 姓名1 |
姓名2 | 姓名2 |
姓名 3 | 姓名 3 |
(空) | 匿名者2 |
姓名 4 | 姓名 4 |
通过以下查询,我可以生成下表
WITH aux ( name ) AS (
SELECT
NULL
FROM
dual
UNION ALL
SELECT
'Name1'
FROM
dual
UNION ALL
SELECT
'Name2'
FROM
dual
UNION ALL
SELECT
'Name3'
FROM
dual
UNION ALL
SELECT
NULL
FROM
dual
UNION ALL
SELECT
'Name4'
FROM
dual
)
SELECT
a.*,
nvl(name, concat('Anon', ROW_NUMBER() OVER(
PARTITION BY name
ORDER BY
ROWNUM
))) output
FROM
aux a;
姓名 | 输出 |
---|---|
姓名1 | 姓名1 |
姓名2 | 姓名2 |
姓名 3 | 姓名 3 |
姓名 4 | 姓名 4 |
(空) | 匿名者 |
(空) | 匿名者2 |
但是,空值出现在末尾而不是原始顺序。有没有办法防止这种情况?
SQL 表表示无序(多)集。没有排序,除非一列指定了排序。如果没有指定行顺序的列,您的问题就没有意义。
如果我假设您有一个排序列,那么您可以执行以下操作:
select name,
coalesce(name,
'anon' || row_number() over (partition by name order by <ordering col>
) as output
from aux
order by <ordering col>;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句