to_char(rownum)
时间: 2025-05-27 19:23:14 浏览: 11
### Oracle 中 DECODE、INSTR 函数用法及 TO_CHAR 和 ROWNUM 转换字符型操作
#### 1. **DECODE 函数详解**
`DECODE` 是一种条件判断函数,在 Oracle 数据库中常用来实现简单的 `IF-THEN-ELSE` 功能。其语法如下:
```sql
DECODE(expression, search1, result1, search2, result2,... , default)
```
- **expression**: 需要比较的表达式。
- **searchN**: 搜索值列表。
- **resultN**: 对应于每个搜索值的结果。
- **default**: 如果没有匹配项,则返回该默认值。
例如,将部门编号转换为部门名称:
```sql
SELECT employee_id, department_id,
DECODE(department_id, 10, 'Administration',
20, 'Marketing',
30, 'Purchasing',
'Unknown Department') AS department_name
FROM employees;
```
此处使用了 `DECODE` 将不同的部门 ID 映射到具体的部门名称[^2]。
---
#### 2. **INSTR 函数解析**
`INSTR` 用于查找子字符串在主字符串中的位置。其语法如下:
```sql
INSTR(string1, string2[, start_position, occurrence])
```
- **string1**: 主字符串。
- **string2**: 子字符串。
- **start_position**(可选): 开始搜索的位置,默认为 1。
- **occurrence**(可选): 查找第几次出现,默认为第一次。
例如,查找单词 "world" 在字符串 "hello world" 中首次出现的位置:
```sql
SELECT INSTR('hello world', 'world') AS position FROM DUAL;
-- 输出:7
```
如果需要查找第二次出现的位置,可以设置 `occurrence` 参数:
```sql
SELECT INSTR('hello world world', 'world', 1, 2) AS second_occurrence FROM DUAL;
-- 输出:13
```
---
#### 3. **TO_CHAR 函数的应用**
`TO_CHAR` 通常用于将日期或数字转换为字符串形式,并允许自定义格式化输出。以下是常见用法:
##### 3.1 数字转换为字符串
可以通过指定格式模型来控制数字显示的方式:
```sql
SELECT salary, TO_CHAR(salary, 'L99,999,999.99') AS formatted_salary
FROM employees;
```
在此示例中,`salary` 被格式化为带货币符号和千分位分隔符的形式[^3]。
##### 3.2 日期转换为字符串
将日期字段按特定格式转换为字符串:
```sql
SELECT hire_date, TO_CHAR(hire_date, 'YYYY-MM-DD HH24:MI:SS') AS formatted_hire_date
FROM employees;
```
这会将 `hire_date` 字段以年-月-日小时:分钟:秒的格式展示[^5]。
---
#### 4. **ROWNUM 转换为字符型**
`ROWNUM` 是 Oracle 提供的一个伪列,表示查询结果集中每一行的序号。虽然它本身是数值类型,但在某些情况下可能需要将其转换为字符串类型以便进一步处理。可以借助 `TO_CHAR` 完成此操作:
```sql
SELECT TO_CHAR(ROWNUM) AS row_number_string, first_name, last_name
FROM employees
WHERE ROWNUM <= 10;
```
以上语句不仅限定了只取前 10 行数据,还将 `ROWNUM` 值转化为字符串存储在新列 `row_number_string` 中。
另外需要注意的是,当涉及排序后再限制行数时,单纯依赖 `ROWNUM` 可能无法满足需求,因为它的赋值发生在过滤之前。此时建议先通过子查询完成排序再应用 `ROWNUM`。
---
### 示例综合运用
下面给出一个综合案例,演示如何联合使用这些技术点:
假设有一个表 `orders` 记录订单详情,现在希望提取最近三天内的部分记录,并对其添加行号标记同时调整金额显示样式:
```sql
WITH recent_orders AS (
SELECT order_id, amount, created_at
FROM orders
WHERE TRUNC(created_at) >= TRUNC(SYSDATE) - INTERVAL '3' DAY
ORDER BY created_at DESC
)
SELECT TO_CHAR(ROWNUM) AS line_no,
order_id,
TO_CHAR(amount, 'L99,999.99') AS formatted_amount,
TO_CHAR(created_at, 'YYYY-MM-DD HH24:MI') AS formatted_created_at
FROM recent_orders
WHERE ROWNUM <= 5;
```
这段脚本首先筛选出近三日内创建的所有订单并依据时间倒序排列;接着在外层选取最多五条符合条件的数据,期间完成了行号标注与金额、日期两项属性的文字美化工作。
---
阅读全文
相关推荐



















