Oracle CONCAT函数详解

一、简介与核心特性

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 进行处理。

相关推荐
清晨0016 分钟前
国产化数据库替代方案:openGauss 详解与 MySQL 平滑迁移实战
数据库·mysql
λqaq713 分钟前
MongoDB数据库基础 :非关系型数据库入门与常用操作
数据库·学习·mongodb·nosql
词却22 分钟前
数据库基础:TCL事务与DDL视图
数据库
码农小麦22 分钟前
LangChain 1.3.18 + DeepSeek-v4-flash 工具调用踩坑实录
网络·数据库·langchain
FfHUCisI34 分钟前
Golang 切片扩容策略
开发语言·数据库·golang
en.en..36 分钟前
Ubuntu嵌入式开发 export环境变量
java·开发语言·数据库
攻城有术42 分钟前
专项攻克——重写 Redis 依赖包方法的 6 种实现方式
java·数据库·redis·bootstrap
IvorySQL1 小时前
基于 PostgreSQL 的非线性回归原理与 AI 数据库融合实践
数据库·人工智能·postgresql
赵渝强老师1 小时前
【赵渝强老师】高斯数据库(openGauss)的数据库对象
数据库·postgresql·opengauss·国产数据库·高斯数据库
DLYSB_1 小时前
交换机不会 HTTP 怎么办:用 SNMP Get / Trap 把指标和中断打到博灵声光 TTS
数据库·报警灯