oracle中唯一合法的原生字符串连接操作符是双竖线||;单竖线|是位运算符,+用于数值加法,&是sql*plus变量提示符,均不可用于字符串拼接。

Oracle里字符串拼接必须用 ||,不是 |、+ 或 &
直接说结论:Oracle中唯一合法的原生字符串连接操作符是双竖线 ||。单竖线 | 是位运算符,+ 只做数值加法,& 是变量替换符(SQL*Plus 里提示输入值用的),全都不起拼接作用。写错会报 ORA-00920: invalid relational operator 或直接语法错误。
|| 支持任意数量字符串、混合类型自动转换
它不挑食:文字、列名、数字、日期都能连,Oracle 自动转成字符串。比如 'ID: ' || employee_id || ' hired on ' || hire_date 完全合法——employee_id 是 number,hire_date 是 date,都隐式转了。
- 数字和日期转字符串时,用的是数据库默认格式(如
TO_CHAR(n)或TO_CHAR(d, 'DD-MON-RR')),结果可能不符合预期,必要时显式用TO_CHAR(col, 'FM999999')或TO_CHAR(date_col, 'YYYY-MM-DD') - 遇到空值(
NULL)会“传染”:任何NULL || 'abc'结果都是NULL,需提前用NVL(col, '')或COALESCE(col, '')处理 - 别名含空格?得用双引号,比如
SELECT first_name || ' ' || last_name AS "Full Name" FROM employees
想拼三个以上字段?|| 比 CONCAT() 真实好用
CONCAT() 函数只接受两个参数,CONCAT(a, b, c) 直接报错;要拼三个就得嵌套:CONCAT(a, CONCAT(b, c))。而 || 没这限制,a || b || c || d 一行搞定,可读性还更好。
- 括号不是必须的,但复杂表达式建议加,比如
(first_name || ' ' || last_name) || ' (' || department_id || ')' - 在
WHERE子句里动态拼模糊匹配很常见:WHERE name LIKE '%' || :search_term || '%',这里不能用CONCAT(),否则得写两层函数 - 注意优先级:
'A' || 'B' || 1 + 2等价于'AB' || 3(先连后算),但'A' || ('B' || 1) + 2就会报错——+左边是字符串,右边是数字,类型不匹配
跨数据库迁移时,|| 是最大兼容雷区
MySQL 默认把 || 当逻辑或(OR),除非开启 PIPES_AS_CONCAT 模式;SQL Server 用 +;PostgreSQL 虽支持 ||,但对 NULL 处理更严格。所以写 Oracle SQL 时别假设其他库也认这个符号。
- 如果代码要多库兼容,优先封装成视图或应用层拼接,避免裸写
|| - 用
CONCAT()也不保险——MySQL 的CONCAT()支持多参,Oracle 的只认两个,函数行为本身就不一致 - 真正安全的通用方案其实是标准 SQL 的
CONCAT()(SQL:2008+),但 Oracle 目前仍不支持该标准多参版,只能靠||底层硬扛
NULL 就能让整列变空。











