题解 | 顾客登录名 拼接(concat、||) 大小写转换upper
顾客登录名
https://www.nowcoder.com/practice/7cbf5e3082954c21a80fc750ce97350f
select cust_id
,cust_name
,upper(concat(substr(cust_contact,1,2),substr(cust_city,1,3))) user_login
from Customers;
||: 天然支持无限连写。
-- 任何支持 || 的库 SELECT a || b || c || d || e;
CONCAT(): Oracle : 只能 CONCAT(a, b)。想拼 5 个?请嵌套 4 层括号。
MySQL/PG/SQL Server : 支持 CONCAT(a, b, c, d, e)。
如果你想用逗号或横杠连接字符串:
||: 必须手动加引号,且难处理 NULL。
-- 如果 b 是 NULL,结果可能变成 'a--c' 或 NULL SELECT a || '-' || b || '-' || c;
CONCAT_WS()(With Separator): Hive/Spark/MySQL/PG 支持此函数。自动跳过 NULL 且自动加分隔符。
-- 即使 b 是 NULL,结果也是 'a-c' (没有多余的横杠) SELECT CONCAT_WS('-', a, b, c);
在 MySQL 中,
CONCAT() 函数没有参数数量限制。
Oracle & PostgreSQL (标准派)
这两个数据库严格遵循 SQL 标准,强烈推荐使用 || 符号。
- 用法:-- 拼接字符串 SELECT 'Hello' || ' ' || 'World' AS result; -- 结果: 'Hello World' -- 拼接字段 SELECT first_name || last_name AS full_name FROM users;
- NULL 处理优势:SELECT 'Hello' || NULL || 'World' AS result; -- 结果: 'HelloWorld' -- 解释:NULL 被自动当作空字符串处理,不会导致结果为 NULL。
- 关于
CONCAT()函数:Oracle: CONCAT(a, b)只能接两个参数!如果要接3个,必须嵌套:CONCAT(CONCAT(a, b), c)。非常麻烦,所以 Oracle 开发者优先用 ||。
PostgreSQL: CONCAT(a, b, c...) 支持多个参数,且同样忽略 NULL。
MySQL (函数派)
MySQL 默认情况下 || 是逻辑“或”运算符(类似 OR),不能用来拼接字符串!除非你开启了特殊的 SQL 模式(生产环境极少开启)。
- 必须用
CONCAT()函数:SELECT CONCAT('Hello', ' ', 'World') AS result; -- 结果: 'Hello World' - ⚠️ NULL 处理陷阱 (非常重要):在 MySQL 中,
CONCAT()只要遇到一个NULL,整个结果就会变成NULL。
SELECT CONCAT('Hello', NULL, 'World') AS result; -- 结果: NULL (而不是 'HelloWorld')
- 解决方案:使用
IFNULL()或COALESCE()先将 NULL 转为空串:
SELECT CONCAT('Hello', IFNULL(middle_name, ''), 'World') AS result;
Hive / Spark SQL (大数据派)
在大数据生态中,函数是首选,符号支持不一。
concat()函数:SELECT concat('Hello', ' ', 'World'); -- 结果: 'Hello World' -- ⚠️ 注意:遇 NULL 返回 NULL (同 MySQL)- 🌟 神器
concat_ws()(强烈推荐):ws代表 "With Separator"(带分隔符)。它是处理逗号分隔列表、日期拼接的神器。
-- 语法:concat_ws(分隔符, 列1, 列2, ...) SELECT concat_ws('-', '2023', '10', '05'); -- 结果: '2023-10-05' -- ⭐ 最大优势:自动跳过 NULL 值! SELECT concat_ws('-', '2023', NULL, '05'); -- 结果: '2023-05' -- 解释:不仅没变成 NULL,连多余的横杠 '-' 都没出现!
做题心得,记录下来,供自己学习

查看1道真题和解析