题解 | 顾客登录名 拼接(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,连多余的横杠 '-' 都没出现!

牛客网题目 文章被收录于专栏

做题心得,记录下来,供自己学习

全部评论

相关推荐

狄文君:多段项目经历 + 专业技能拉满,这简历很能打,坐等好消息!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务