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
基本语法:
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
-
说起字符串拼接,不同数据库系统里其实有很多方法。比如在SQL Server里,我们常用
+
||
CONCAT
最大的区别,也是我个人觉得最容易被忽视但又最关键的一点,就是它们对
NULL
+
+
NULL
NULL
NULL
-- SQL Server 示例 SELECT 'Prefix-' + NULL + '-Suffix' AS ResultUsingPlus; -- 结果:NULL
||
+
||
NULL
NULL
NULL
-- MySQL / PostgreSQL / Oracle 示例 SELECT 'Prefix-' || NULL || '-Suffix' AS ResultUsingDoublePipe; -- 结果:NULL
CONCAT
CONCAT
NULL
NULL
+
||
-- 各种支持CONCAT的数据库示例
SELECT CONCAT('Prefix-', NULL, '-Suffix') AS ResultUsingConcat;
-- 结果:Prefix--Suffix在我看来,这种差异在实际项目中特别容易造成意想不到的问题。如果你期望即使部分数据缺失也能得到一个部分拼接的结果,那么
CONCAT
+
||
NULL
除了基础的
CONCAT
CONCAT_WS
WS
基本语法:
CONCAT_WS(separator, string1, string2, string3, ...)
这里的
separator
string1
string2
一个例子: 假设我们想把一个人的姓、名、中间名拼接起来,中间用空格隔开。
SELECT CONCAT_WS(' ', 'Doe', 'John', 'M.') AS FullName;结果会是:
Doe John M.
CONCAT_WS
NULL
代码更简洁: 想象一下,如果你要拼接好几个字段,并且每个字段之间都需要一个相同且固定的分隔符(比如逗号、空格、连字符),使用
CONCAT_WS
CONCAT
-- 使用CONCAT_WS
SELECT CONCAT_WS(', ', 'Street', 'City', 'State', 'Zip') AS FullAddress;
-- 对比使用CONCAT(更繁琐)
SELECT CONCAT('Street', ', ', 'City', ', ', 'State', ', ', 'Zip') AS FullAddress_Verbose;对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_WS
CONCAT
CONCAT_WS
构建完整的地址信息: 数据库中地址信息通常是分散存储的,比如有省份、城市、区县、街道、门牌号等。在生成客户报告或物流单据时,我们需要一个完整的地址字符串。
-- 假设有表Customers,包含Province, City, District, Street, HouseNumber
SELECT
CONCAT_WS('',
c.Province,
c.City,
c.District,
c.Street,
c.HouseNumber
) AS FullAddress
FROM
Customers c;这里我用了空字符串作为分隔符,因为中文地址通常是连在一起的。如果需要英文地址,则可以换成逗号和空格。
生成格式化的姓名或联系人信息: 将姓、名、中间名拼接起来,或者将电话区号和电话号码拼接起来,是常见的需求。
-- 拼接姓名
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
创建唯一的标识符或编码: 有时候需要根据现有数据生成一个符合特定规则的唯一编码,比如产品SKU、订单号前缀等。
-- 假设Product表有CategoryCode, ItemID, Version
SELECT
CONCAT(p.CategoryCode, '-', p.ItemID, '-', p.Version) AS ProductSKU
FROM
Products p;动态生成报表描述或状态信息: 在一些报表中,可能需要根据多个字段的状态,动态生成一段描述性文字。
-- 假设Order表有OrderStatus, OrderDate, TotalAmount
SELECT
CONCAT(
'订单号 ', o.OrderID, ' 于 ', o.OrderDate, ' 状态为 [', o.OrderStatus, '], 总金额: ', o.TotalAmount
) AS OrderSummary
FROM
Orders o;这些场景都体现了
CONCAT
CONCAT_WS
以上就是SQL字符串拼接函数CONCAT怎么用?详解CONCAT函数的语法与实战案例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号