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

Spark SQL拆分字符串列时如何让无分隔符行的首字段返回null

实现字符串按'-'拆分补null的方案

以下是不同SQL方言的可运行实现,均能满足无分隔符时col1返回null、col2返回原值的需求:

通用逻辑(兼容多数SQL引擎)

核心思路:判断原字符串是否包含分隔符-,分别处理两种场景,避免拆分后数组长度不一致的问题。
示例使用原列名为original_col、表名为your_table,可自行替换为实际名称。

Hive/Spark SQL 写法

写法1:无需子查询,直接判断

SELECT
  CASE WHEN original_col RLIKE '-' THEN split(original_col, '-', 2)[0] END AS col1,
  COALESCE(split(original_col, '-', 2)[1], original_col) AS col2
FROM your_table;

写法2:仅拆分一次,性能更优

SELECT
  IF(size(split_arr) = 2, split_arr[0], NULL) AS col1,
  IF(size(split_arr) = 2, split_arr[1], split_arr[0]) AS col2
FROM (
  SELECT split(original_col, '-', 2) AS split_arr FROM your_table
) t;

Spark SQL 2.4+ 还可以用element_at简化写法:

SELECT
  element_at(split(original_col, '-', 2), 1) AS col1,
  COALESCE(element_at(split(original_col, '-', 2), 2), original_col) AS col2
FROM your_table;

MySQL 8.0+ 写法

SELECT
  IF(LOCATE('-', original_col) > 0, SUBSTRING_INDEX(original_col, '-', 1), NULL) AS col1,
  SUBSTRING_INDEX(original_col, '-', -1) AS col2
FROM your_table;

PostgreSQL 写法

SELECT
  CASE WHEN strpos(original_col, '-') > 0 THEN split_part(original_col, '-', 1) END AS col1,
  split_part(original_col, '-', CASE WHEN strpos(original_col, '-') > 0 THEN 2 ELSE 1 END) AS col2
FROM your_table;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:36:03