MySQL中如何在SELECT语句拼接姓名?拼接返回0问题解决
解决SQL字符串拼接返回0的问题
嘿,这个坑我之前也踩过!你遇到的问题根源出在字符串拼接的运算符用错了,咱们来拆解下:
你原来的写法是concat(u.fname + ' ' + u.lname),这里的+在绝大多数SQL数据库里是算术加法运算符,不是字符串拼接用的。当数据库看到字符串和+号时,会尝试把字符串转换成数值类型,如果转换失败(比如名字是纯文本),就会默认转成0,最后几个0加起来自然全返回0了。
下面给你针对不同数据库的正确拼接方式:
1. MySQL/MariaDB 环境
直接用CONCAT函数,参数用逗号分隔(不需要+):
SELECT t.test_id, t.appt_date, t.appt_time, t.appt_site, p.process_date, p.pool_status, t.test_status, CONCAT(u.fname, ' ', u.lname) AS processed_by FROM .....
如果担心fname或lname为NULL导致整个拼接结果变成NULL,可以用CONCAT_WS(自动忽略NULL值,用指定分隔符拼接):
CONCAT_WS(' ', u.fname, u.lname) AS processed_by
2. SQL Server 环境
有两种常用方式:
- 用
+号拼接(但要确保字段都是字符串类型,且无NULL,否则结果会变成NULL):
SELECT t.test_id, t.appt_date, t.appt_time, t.appt_site, p.process_date, p.pool_status, t.test_status, u.fname + ' ' + u.lname AS processed_by FROM .....
- 用
CONCAT函数(自动处理NULL,把NULL当作空字符串):
SELECT t.test_id, t.appt_date, t.appt_time, t.appt_site, p.process_date, p.pool_status, t.test_status, CONCAT(u.fname, ' ', u.lname) AS processed_by FROM .....
3. PostgreSQL 环境
可以用||运算符,或者CONCAT函数:
-- 方式1:用||运算符 SELECT t.test_id, t.appt_date, t.appt_time, t.appt_site, p.process_date, p.pool_status, t.test_status, u.fname || ' ' || u.lname AS processed_by FROM ..... -- 方式2:用CONCAT函数 SELECT t.test_id, t.appt_date, t.appt_time, t.appt_site, p.process_date, p.pool_status, t.test_status, CONCAT(u.fname, ' ', u.lname) AS processed_by FROM .....
小提醒:如果你的业务场景中存在字段为NULL的情况,优先选CONCAT(三大主流数据库都支持)或CONCAT_WS(仅MySQL),能避免拼接结果意外变成NULL的问题。
内容的提问来源于stack exchange,提问作者Josh Lee
相关产品推荐
相关产品推荐

