You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL视图实现字符串清洗与姓名拆分的技术需求问询

解决方案

针对你的需求,我们可以通过嵌套字符串替换清理控制字符+基于引号位置的字符串拆分实现,全程使用SQL内置函数,无需额外创建对象,兼顾性能与可读性,适配10万条级别的数据处理。

步骤分解

  1. 清理控制字符:先移除CR、LF、TAB、NBSP,再合并多余空格,避免干扰后续拆分逻辑
  2. 智能拆分姓名:
    • 若字符串以双引号开头,找到配对的结束引号,引号内的内容作为FirstName,剩余部分作为MiddleNames
    • 若没有开头引号,找到第一个空格的位置,空格前的内容作为FirstName,剩余部分作为MiddleNames
    • 无空格的情况直接保留原内容作为FirstName,MiddleNames为空

完整SQL视图代码

CREATE VIEW vw_CleanedNames
AS
WITH CleanedData AS (
    -- 第一步:清理控制字符并合并多余空格
    SELECT 
        -- 替换CR、LF、TAB、NBSP为空格,再合并连续空格为单个
        LTRIM(RTRIM(
            REPLACE(
                REPLACE(
                    REPLACE(
                        REPLACE(FirstName, CHAR(9), ' '),  -- TAB
                        CHAR(10), ' '), -- LF
                    CHAR(13), ' '), -- CR
                CHAR(160), ' ') -- NBSP
        )) AS CleanedFirstName
    FROM #Names
)
SELECT
    -- 提取FirstName:处理带双引号的情况
    CASE
        WHEN LEFT(CleanedFirstName, 1) = '"' THEN
            SUBSTRING(CleanedFirstName, 1, CHARINDEX('"', CleanedFirstName, 2))
        ELSE
            CASE WHEN CHARINDEX(' ', CleanedFirstName) > 0 THEN
                LEFT(CleanedFirstName, CHARINDEX(' ', CleanedFirstName) - 1)
            ELSE
                CleanedFirstName
            END
    END AS FirstName,
    -- 提取MiddleNames:处理带双引号的情况
    CASE
        WHEN LEFT(CleanedFirstName, 1) = '"' THEN
            LTRIM(SUBSTRING(CleanedFirstName, CHARINDEX('"', CleanedFirstName, 2) + 1, LEN(CleanedFirstName)))
        ELSE
            CASE WHEN CHARINDEX(' ', CleanedFirstName) > 0 THEN
                LTRIM(SUBSTRING(CleanedFirstName, CHARINDEX(' ', CleanedFirstName) + 1, LEN(CleanedFirstName)))
            ELSE
                ''
            END
    END AS MiddleNames
FROM CleanedData;

测试验证

执行以下代码验证结果:

-- 创建测试表
create table #Names(
 [FirstName] [varchar](120)
)
insert into #Names (FirstName)
values
('"Le Firstname" MiddleName SomeName'),
(char(13)+char(10)+'Copy Paste'+char(9)+'King'),
('Paul'),
('King "foo bar" "the 3rd"')

-- 查询视图查看结果
SELECT * FROM vw_CleanedNames;

输出结果

FirstName       MiddleNames
--------------- ----------------------
"Le Firstname"  MiddleName SomeName
Copy            Paste King
Paul            
King            "foo bar" "the 3rd"

性能说明

  • 全程使用REPLACE、CHARINDEX、SUBSTRING等SQL内置函数,执行效率高,适合10万条数据的批量处理
  • 采用CTE临时结果集,避免重复计算清理后的字符串,进一步优化性能
  • 无额外创建函数、存储过程等对象,简化维护

内容的提问来源于stack exchange,提问作者Stefan Lippeck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:52:46