一、简介与核心特性
CONCAT 是 Oracle 中用于字符串拼接的内置函数,它与 || 操作符功能相同,但在特定场景下具有独特价值。
| 特性 | 说明 |
|---|---|
| 核心能力 | 将两个字符串拼接成一个完整字符串 |
| 语法 | CONCAT(string1, string2) |
| 支持类型 | CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, NCLOB |
| NULL 行为 | 任一参数为 NULL 时,结果为 NULL |
| 参数限制 | 原生只接受 2 个参数,超过需嵌套 |
| 等效性 | 与 |
二、基本语法与 NULL 处理
2.1 基本用法
sql
--直接拼接两个字符串
SELECT CONCAT('Hello', ' World') AS result FROM DUAL;
--结果: Hello World
--拼接表字段
SELECT CONCAT(first_name, last_name) AS full_name FROM employees;
2.2 NULL 处理陷阱(重要)
当任一参数为 NULL 时,CONCAT 会将整个结果置为 NULL。这与 || 操作符的行为存在差异。
sql
--❌NULL会导致整个结果为NULL
SELECT CONCAT('Hello', NULL) AS result FROM DUAL;
--结果: (空)
--✅使用NVL或COALESCE预先处理NULL值
SELECT CONCAT(NVL(first_name, ''), ' ') AS name FROM employees;
对比一图看懂:
text
┌─────────────────────────────────────────────────────────────┐
│ CONCAT 与 || 对 NULL 的处理对比 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 场景:字符串 A = 'Hello' ,字符串 B = NULL │
│ │
│ CONCAT(A, B) → NULL (整体被污染) │
│ A || B → Hello (保留有效部分) │
│ │
│ ⚠️ CONCAT 在拼接时任一字符串为NULL,结果即为NULL │
│ ✅ 拼接前务必用 NVL 处理可能为NULL的字段 │
│ │
│ 最佳实践: │
│ SELECT CONCAT(NVL(last_name, ''), ', ') ... │
└─────────────────────────────────────────────────────────────┘
⚠️ 关键风险 :如果直接拼接可能为 NULL 的字段(如某些员工的 last_name 为空),整个结果会被置为 NULL,造成"隐式丢失数据"。务必在拼接前使用 NVL 或 COALESCE 进行处理。