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

相关推荐
彦为君1 分钟前
Redis最新版本特性
java·数据库·redis·算法·bootstrap
vigor51221 分钟前
MySQL通过Mango实现分库分表
android·数据库·mysql
weixin1997010801625 分钟前
[特殊字符]《京东订单API(jd.order.detail.get)对接ERP:企业认证+OAuth授权避坑指南》(附Python源码)
java·数据库·python
赵渝强老师29 分钟前
【赵渝强老师】高斯数据库(openGauss)的模式
数据库·opengauss·国产数据库·高斯数据库
长不胖的路人甲32 分钟前
Redis 数据删除策略
数据库·redis·spring
ClouGence44 分钟前
SQL Server CDC 如何降低主库压力?Always On 备库读取实践
数据库·后端·sql·sqlserver
尽兴-1 小时前
Redis 为什么快?
数据库·redis·内存
林澈在路上1 小时前
最新版权清晰 AI音乐写歌工具软件App推荐 商用全场景实测指南
数据库·人工智能·ai·aigc·音频
Full Stack Developme2 小时前
正则表达式的使用教程
java·数据库·正则表达式
大郭鹏宇2 小时前
MongoDB快速实战与基本原理入门
数据库·mongodb