在 TO_CHAR
函数的格式字符串中,#
和 0
的作用如下:
#
表示可选数字位
- 可选数字:如果数字在该位置上没有值(例如,数字是 123.4),那么这个位置可以不显示。例如:
- 格式:
#,##0.##
- 数字
123.4
显示为123.4
。 - 数字
123
显示为123
。 - 数字
0
显示为0
,但没有小数部分。
- 格式:
0
表示必须显示的数字位
- 必须显示:如果数字在该位置上没有值,则会用零代替,确保这个位置始终显示一个数字。例如:
- 格式:
#,##0.00
- 数字
123.4
显示为123.40
(强制显示两位小数)。 - 数字
123
显示为123.00
(同样强制显示两位小数)。 - 数字
0
显示为0.00
(强制显示两位小数)。
- 格式:
示例总结
- 使用
#
你可以得到更简洁的显示,不会显示多余的零。 - 使用
0
可以确保始终看到数字,即使是零。
选择格式
- 如果你希望保留小数并且强制显示两位小数,使用
#,##0.00
。 - 如果你希望小数位根据实际值变化,可以使用
#,##0.##
。
ROW_NUMBER() OVER (ORDER BY FIRMID) AS “序号”, 这个和ROWNUM AS “序号”, 有什么区别啊
ROWNUM
和 ROW_NUMBER()
是 Oracle 数据库中用于生成行号的两种不同方法,它们之间有几个重要区别:
1. 生成时机
-
ROWNUM
:- 在结果集生成之前计算。它是在查询结果集生成的过程中分配的行号。
- 如果您对查询结果进行了排序,
ROWNUM
将在排序之前分配行号,因此可能不会按照预期的顺序排列。
-
ROW_NUMBER()
:- 是一个分析函数,计算是在结果集生成之后的。它在所有行都被选出并排序后才生成行号。
- 可以在
OVER
子句中指定排序规则,从而确保行号是按您指定的顺序分配的。
2. 用法
-
ROWNUM
:- 直接在
SELECT
语句中使用。 - 例如:
SELECT ROWNUM AS "序号", column1 FROM table_name;
- 直接在
-
ROW_NUMBER()
:- 需要与
OVER
子句一起使用,通常用于根据某一列或多列的排序给每一行分配一个唯一的序号。 - 例如:
SELECT ROW_NUMBER() OVER (ORDER BY column1) AS "序号", column1 FROM table_name;
- 需要与
3. 行号的唯一性
-
ROWNUM
:- 在某些情况下,
ROWNUM
可能会导致重复的行号,尤其是在没有排序的情况下。
- 在某些情况下,
-
ROW_NUMBER()
:- 总是为每一行分配唯一的行号,即使在结果集中有重复的值。
例子
假设有一个表 employees
,我们希望为按 salary
排序的员工生成行号:
-
使用
ROWNUM
的查询:SELECT ROWNUM, e.* FROM employees e ORDER BY e.salary; -- 这里的排序不会影响 ROWNUM 的分配
-
使用
ROW_NUMBER()
的查询:SELECT ROW_NUMBER() OVER (ORDER BY e.salary) AS "序号", e.* FROM employees e;
在这个例子中,ROW_NUMBER()
会确保行号是根据 salary
排序后分配的,而 ROWNUM
不会。
总结
- 如果您需要按特定顺序生成行号,并且确保每一行都有唯一的序号,使用
ROW_NUMBER()
是更合适的选择。 - 如果您只是需要一个简单的行号,并且不关心排序,可以使用
ROWNUM
。
示例数据
假设有一个名为 employees
的表,包含以下字段和数据:
employee_id | name | salary |
---|---|---|
1 | Alice | 5000 |
2 | Bob | 7000 |
3 | Charlie | 6000 |
4 | David | 8000 |
5 | Eve | 7000 |
示例 1: 使用 ROWNUM
SELECT ROWNUM AS "序号", name, salary
FROM employees
WHERE salary > 6000;
结果:
序号 | name | salary |
---|---|---|
1 | Bob | 7000 |
2 | David | 8000 |
解释:
ROWNUM
在查询结果返回之前计算,因此即使Bob
和David
的薪资是大于 6000 的,行号仍然是按结果集生成的顺序分配的。
示例 2: 使用 ROW_NUMBER()
SELECT ROW_NUMBER() OVER (ORDER BY salary DESC) AS "序号", name, salary
FROM employees;
结果:
序号 | name | salary |
---|---|---|
1 | David | 8000 |
2 | Bob | 7000 |
3 | Eve | 7000 |
4 | Charlie | 6000 |
5 | Alice | 5000 |
解释:
ROW_NUMBER()
根据salary
的降序排序后生成行号,因此David
的行号为 1,Bob
和Eve
的行号分别为 2 和 3。
示例 3: 同时使用 ROWNUM
和 ROW_NUMBER()
SELECT ROWNUM AS "序号", T.*
FROM (SELECT ROW_NUMBER() OVER (ORDER BY salary DESC) AS "行号", name, salaryFROM employees
) T
WHERE T.salary > 6000;
结果:
序号 | 行号 | name | salary |
---|---|---|---|
1 | 2 | Bob | 7000 |
2 | 1 | David | 8000 |
解释:
- 内部查询使用
ROW_NUMBER()
生成按薪资降序排序的行号。 - 外部查询使用
ROWNUM
生成外部序号,显示符合条件的记录。
总结
ROWNUM
: 在查询中直接生成行号,计算在结果集生成之前,可能导致意外的行号分配。ROW_NUMBER()
: 根据指定的排序生成行号,适用于需要根据特定顺序生成唯一行号的场景。
希望这些示例能够帮助您更好地理解 ROWNUM
和 ROW_NUMBER()
的使用。如果还有其他问题,请随时问我!