0

0

SQL字符串拼接函数CONCAT怎么用?详解CONCAT函数的语法与实战案例

爱谁谁

爱谁谁

发布时间:2025-08-08 16:56:01

|

512人浏览过

|

来源于php中文网

原创

concat函数用于将多个字符串拼接成一个新字符串,语法为concat(string1, string2, ...),支持列名、字面量或函数返回值;2. concat会将null值视为空字符串处理,不会导致整个结果为null,而+或||操作符在遇到null时会返回null;3. concat_ws函数在拼接时可指定分隔符,语法为concat_ws(separator, string1, string2, ...),且能自动跳过null值并避免多余分隔符;4. concat和concat_ws广泛应用于地址拼接、姓名格式化、电话号码组合、唯一编码生成及动态描述生成等数据清洗与报表场景,提升数据可读性与输出灵活性。

SQL字符串拼接函数CONCAT怎么用?详解CONCAT函数的语法与实战案例

SQL字符串拼接,这玩意儿在数据处理里简直是家常便饭。说白了,就是把好几段文本信息拼成一段。而提到拼接,

CONCAT
函数绝对是个绕不开的名字,它就是用来干这事的。它能把两个或多个字符串连接起来,形成一个新的字符串,用起来非常直观。

解决方案

CONCAT
函数的核心功能就是将传入的多个字符串参数按顺序连接成一个单一的字符串。它的语法非常简单,你只需要把想拼接的字符串一个接一个地放进去就行了。

基本语法:

CONCAT(string1, string2, string3, ...)

这里的

string1
,
string2
,
string3
等可以是列名、字符串字面量,甚至是其他函数的返回值,只要它们最终能解析成字符串类型就行。

一个简单的例子: 假设我们想把“Hello”和“World”拼起来,中间加个空格。

SELECT CONCAT('Hello', ' ', 'World') AS Greeting;

结果会是:

Hello World

关于NULL值的处理,这是个关键点:

CONCAT
函数在处理
NULL
值时有个非常“友好”的特性——它会把
NULL
值当作空字符串(
''
)来处理。这意味着,如果你的某个拼接参数是
NULL
,它不会导致整个结果变成
NULL
,而是直接跳过这个
NULL
值。

SELECT CONCAT('Prefix-', NULL, '-Suffix') AS ResultWithNull;

这个查询的结果会是:

Prefix--Suffix
。你看,
NULL
值被忽略了,但它两边的分隔符(这里是连字符
-
)还在。这在我看来,是个非常实用的特性,尤其是在处理可能有缺失数据但又不想整个字段失效的场景。

CONCAT函数与传统拼接方式有何不同?

说起字符串拼接,不同数据库系统里其实有很多方法。比如在SQL Server里,我们常用

+
操作符;而在Oracle、PostgreSQL或MySQL中,
||
操作符也相当流行。那么,
CONCAT
函数和这些“老前辈”比起来,到底有什么不一样呢?

最大的区别,也是我个人觉得最容易被忽视但又最关键的一点,就是它们对

NULL
值的处理方式。

  • +
    操作符 (SQL Server):如果你用
    +
    来拼接字符串,只要其中任何一个字符串是
    NULL
    ,那么整个拼接结果都会变成
    NULL
    。这被称为
    NULL
    传播。

    -- SQL Server 示例
    SELECT 'Prefix-' + NULL + '-Suffix' AS ResultUsingPlus;
    -- 结果:NULL
  • ||
    操作符 (Oracle, PostgreSQL, MySQL等):与
    +
    类似,
    ||
    操作符也遵循
    NULL
    传播的原则。如果参与拼接的任何一个部分是
    NULL
    ,最终结果就是
    NULL

    -- MySQL / PostgreSQL / Oracle 示例
    SELECT 'Prefix-' || NULL || '-Suffix' AS ResultUsingDoublePipe;
    -- 结果:NULL
  • CONCAT
    函数 (MySQL, SQL Server 2012+, Oracle, PostgreSQL等):前面提到了,
    CONCAT
    函数会把
    NULL
    值视为一个空字符串来处理,它不会导致整个结果变为
    NULL
    。这是它与
    +
    ||
    最本质的区别,也正是它在处理不确定数据时显得更加“宽容”和灵活的原因。

    -- 各种支持CONCAT的数据库示例
    SELECT CONCAT('Prefix-', NULL, '-Suffix') AS ResultUsingConcat;
    -- 结果:Prefix--Suffix

在我看来,这种差异在实际项目中特别容易造成意想不到的问题。如果你期望即使部分数据缺失也能得到一个部分拼接的结果,那么

CONCAT
无疑是更稳妥的选择。而如果你需要严格控制,只要有任何一个部分缺失就认为整个拼接无效,那么
+
||
可能更符合你的逻辑。理解这一点,能帮助我们避免很多因为
NULL
值引发的数据处理陷阱。

CA.LA
CA.LA

第一款时尚产品在线设计平台,服装设计系统

下载

CONCAT_WS函数又是什么?它在实际应用中有哪些优势?

除了基础的

CONCAT
函数,你可能还会遇到一个它的“兄弟”——
CONCAT_WS
。这个函数的名字很有趣,
WS
代表“With Separator”,顾名思义,它在拼接字符串时,允许你指定一个分隔符,这个分隔符会自动插入到每个被拼接的字符串之间。

基本语法:

CONCAT_WS(separator, string1, string2, string3, ...)

这里的

separator
是你希望在每个字符串之间插入的字符或字符串。而
string1
,
string2
等仍然是被拼接的字符串。

一个例子: 假设我们想把一个人的姓、名、中间名拼接起来,中间用空格隔开。

SELECT CONCAT_WS(' ', 'Doe', 'John', 'M.') AS FullName;

结果会是:

Doe John M.

CONCAT_WS
的优势在于它的简洁性和对
NULL
值的智能处理:

  1. 代码更简洁: 想象一下,如果你要拼接好几个字段,并且每个字段之间都需要一个相同且固定的分隔符(比如逗号、空格、连字符),使用

    CONCAT_WS
    会比手动在每个
    CONCAT
    参数之间插入分隔符要简洁得多。

    -- 使用CONCAT_WS
    SELECT CONCAT_WS(', ', 'Street', 'City', 'State', 'Zip') AS FullAddress;
    
    -- 对比使用CONCAT(更繁琐)
    SELECT CONCAT('Street', ', ', 'City', ', ', 'State', ', ', 'Zip') AS FullAddress_Verbose;
  2. NULL
    值的智能处理: 这点和
    CONCAT
    类似,但更进一步。
    CONCAT_WS
    不仅会将
    NULL
    参数视为一个空字符串,它还会聪明地跳过这些
    NULL
    值,并且不会在
    NULL
    值的位置插入分隔符。这意味着,如果某个字段是
    NULL
    ,它不会在结果中留下多余的分隔符。

    SELECT CONCAT_WS(', ', 'Last Name', 'First Name', NULL, 'Jr.') AS FormattedName;

    结果会是:

    Last Name, First Name, Jr.
    。注意到
    NULL
    对应的部分和它旁边的逗号都被跳过了,这在处理地址、姓名等不确定字段时非常有用,能确保输出的字符串格式始终整洁。在我看来,
    CONCAT_WS
    就是
    CONCAT
    的一个高级定制版,它更懂我们想要什么,尤其是在需要统一格式输出的场景下,简直是神器。

CONCAT函数在数据清洗与报表生成中的高级应用场景?

CONCAT
CONCAT_WS
函数远不止是简单的字符串拼接工具,它们在实际的数据清洗、数据转换以及报表生成过程中扮演着非常重要的角色。有时候,为了报表输出或者前端展示的需求,我们得把数据库里零散的数据拼接成一个完整、可读的字符串。
CONCAT
CONCAT_WS
在这方面就显得尤为得力。

  1. 构建完整的地址信息: 数据库中地址信息通常是分散存储的,比如有省份、城市、区县、街道、门牌号等。在生成客户报告或物流单据时,我们需要一个完整的地址字符串。

    -- 假设有表Customers,包含Province, City, District, Street, HouseNumber
    SELECT
        CONCAT_WS('',
            c.Province,
            c.City,
            c.District,
            c.Street,
            c.HouseNumber
        ) AS FullAddress
    FROM
        Customers c;

    这里我用了空字符串作为分隔符,因为中文地址通常是连在一起的。如果需要英文地址,则可以换成逗号和空格。

  2. 生成格式化的姓名或联系人信息: 将姓、名、中间名拼接起来,或者将电话区号和电话号码拼接起来,是常见的需求。

    -- 拼接姓名
    SELECT
        CONCAT_WS(' ', c.FirstName, c.MiddleName, c.LastName) AS FullName
    FROM
        Customers c;
    
    -- 拼接电话号码 (假设AreaCode可能为NULL)
    SELECT
        CONCAT('(', c.AreaCode, ') ', c.PhoneNumber) AS FormattedPhone
    FROM
        Customers c;

    注意到电话号码的例子,如果

    AreaCode
    NULL
    CONCAT
    会跳过它,结果可能是
    ( ) 12345678
    ,这可能不是我们想要的。这时,我们可以结合
    CASE
    语句或者
    IFNULL
    (或
    COALESCE
    )函数来做更精细的控制:

    SELECT
        CONCAT(
            CASE WHEN c.AreaCode IS NOT NULL THEN CONCAT('(', c.AreaCode, ') ') ELSE '' END,
            c.PhoneNumber
        ) AS FormattedPhone_Advanced
    FROM
        Customers c;

    这个例子展示了

    CONCAT
    如何与其他SQL函数结合,实现更复杂的逻辑。

  3. 创建唯一的标识符或编码: 有时候需要根据现有数据生成一个符合特定规则的唯一编码,比如产品SKU、订单号前缀等。

    -- 假设Product表有CategoryCode, ItemID, Version
    SELECT
        CONCAT(p.CategoryCode, '-', p.ItemID, '-', p.Version) AS ProductSKU
    FROM
        Products p;
  4. 动态生成报表描述或状态信息: 在一些报表中,可能需要根据多个字段的状态,动态生成一段描述性文字。

    -- 假设Order表有OrderStatus, OrderDate, TotalAmount
    SELECT
        CONCAT(
            '订单号 ', o.OrderID, ' 于 ', o.OrderDate, ' 状态为 [', o.OrderStatus, '], 总金额: ', o.TotalAmount
        ) AS OrderSummary
    FROM
        Orders o;

这些场景都体现了

CONCAT
CONCAT_WS
在数据整合和展示方面的强大能力。它们让我们可以更灵活地控制数据的输出格式,满足各种复杂的业务需求。在数据处理的世界里,灵活运用这些看似简单的函数,往往能解决大问题。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

678

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

346

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

675

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

573

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

415

2024.04.29

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

2

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

Webpack4.x---十天技能课堂
Webpack4.x---十天技能课堂

共20课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号