You need to enable JavaScript to run this app. Oracle SQL Developer多分隔符拆分姓名列生成扁平化单一新列方法
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL Developer多分隔符拆分姓名列生成扁平化单一新列方法

Oracle SQL 多分隔符姓名拆分实现(扁平化单列)

核心适配规则

  • 识别两类拆分分隔符:带前后空格的and、逗号(兼容逗号后带空格的场景)
  • 拆分后输出为单一NEW_NAME列,无空值、重复值。

方案一:基于现有SUBSTR逻辑改造(适配当前简单数据量)

你当前写的4列拆分逻辑,核心问题是分隔符不存在时INSTR返回0,会生成空值或重复全量字符串,只需将横向多列转纵向单列,过滤无效值即可。

实现代码

-- 新建表存储拆分结果,可先移除建表语句仅运行SELECT验证结果
CREATE TABLE new_name_table AS
WITH raw_split AS (
    SELECT 
        -- 仅当存在逗号时,拆分逗号前后的姓名
        CASE WHEN INSTR(name, ',', 1, 1) > 0 THEN TRIM(SUBSTR(name, 1, INSTR(name, ',', 1, 1) - 1)) END AS split_comma_before,
        CASE WHEN INSTR(name, ',', 1, 1) > 0 THEN TRIM(SUBSTR(name, INSTR(name, ',', 1, 1) + 1, LENGTH(name))) END AS split_comma_after,
        -- 仅当存在`and`分隔符时,拆分前后姓名
        CASE WHEN INSTR(name, ' and ', 1, 1) > 0 THEN TRIM(SUBSTR(name, 1, INSTR(name, ' and ', 1, 1) - 1)) END AS split_and_before,
        CASE WHEN INSTR(name, ' and ', 1, 1) > 0 THEN TRIM(SUBSTR(name, INSTR(name, ' and ', 1, 1) + 1, LENGTH(name))) END AS split_and_after,
        -- 无任何分隔符时,兜底取原始姓名
        CASE WHEN INSTR(name, ',', 1, 1) = 0 AND INSTR(name, ' and ', 1, 1) = 0 THEN TRIM(name) END AS split_raw_only
    FROM original_business_table -- 替换为你的实际原业务表名
)
-- 多列转单列,过滤空值、去重
SELECT DISTINCT split_val AS NEW_NAME
FROM raw_split
UNPIVOT (
    split_val FOR col IN (split_raw_only, split_comma_before, split_comma_after, split_and_before, split_and_after)
)
WHERE split_val IS NOT NULL;

说明:UNPIVOT语法可直接将横向多列转为纵向行,效果与多次UNION ALL完全一致,代码更简洁。

方案二:通用正则拆分方案(适配任意数量姓名场景)

如果后续业务出现一行包含3个及以上姓名(如A, B and C),原有SUBSTR逻辑无法覆盖,可使用通用正则拆分方案:

实现代码

CREATE TABLE new_name_table AS
WITH prep_data AS (
    -- 统一替换两类分隔符为逗号,简化后续拆分逻辑
    SELECT REPLACE(REPLACE(name, ' and ', ','), ', ', ',') AS standardized_name
    FROM original_business_table
),
split_rows AS (
    -- 递归拆分所有逗号分隔的姓名
    SELECT REGEXP_SUBSTR(standardized_name, '[^,]+', 1, LEVEL) AS NEW_NAME
    FROM prep_data
    CONNECT BY LEVEL <= REGEXP_COUNT(standardized_name, ',') + 1
        AND PRIOR SYS_GUID() IS NOT NULL -- 避免递归死循环
        AND PRIOR standardized_name = standardized_name
)
SELECT DISTINCT TRIM(NEW_NAME) AS NEW_NAME
FROM split_rows
WHERE NEW_NAME IS NOT NULL;

最终输出效果

执行后生成的new_name_table完全匹配需求:

| NEW_NAME      |
|---------------|
| Joe Smith     |
| John Doe      |
| Jane Doe      |
| Jenny May     |
| Steven Thomas |

内容的提问来源于stack exchange,提问作者ai.jennetta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 15:15:10