如何从TableA的Years列提取每行的最新年份?
提取混合分隔符年份列的最新年份解决思路
核心逻辑分三步走,适配主流关系型数据库:
通用步骤
- 统一分隔符:先把列中混合的分号(
;)和逗号(,)替换成同一种,比如全部换成逗号,确保字符串格式一致 - 拆分年份字符串:将统一后的字符串拆分成单个年份值的集合
- 提取最大值:把每个年份转成数值类型,取最大值就是最新年份
各数据库具体实现示例
MySQL(8.0+)
如果你的MySQL版本支持STRING_SPLIT(8.0.19及以上),可以用最简单的写法:
SELECT Years, MAX(CAST(s.value AS UNSIGNED)) AS LatestYear FROM TableA JOIN STRING_SPLIT(REPLACE(Years, ';', ','), ',') s GROUP BY Years;
如果版本较低,用递归CTE生成数字序列配合正则拆分:
WITH RECURSIVE nums(n) AS ( SELECT 1 UNION ALL SELECT n+1 FROM nums WHERE n <= 10 ) SELECT t.Years, MAX(CAST(REGEXP_SUBSTR(REPLACE(t.Years, ';', ','), '[^,]+', 1, nums.n) AS UNSIGNED)) AS LatestYear FROM TableA t JOIN nums ON nums.n <= LENGTH(REPLACE(t.Years, ';', ',')) - LENGTH(REPLACE(REPLACE(t.Years, ';', ','), ',', '')) + 1 GROUP BY t.Years;
SQL Server(2016+)
利用STRING_SPLIT函数快速拆分:
SELECT t.Years, MAX(CAST(s.value AS INT)) AS LatestYear FROM TableA t CROSS APPLY STRING_SPLIT(REPLACE(t.Years, ';', ','), ',') s GROUP BY t.Years;
PostgreSQL
用STRING_TO_ARRAY和UNNEST组合拆分:
SELECT t.Years, MAX(CAST(s.year AS INT)) AS LatestYear FROM TableA t CROSS JOIN UNNEST(STRING_TO_ARRAY(REPLACE(t.Years, ';', ','), ',')) AS s(year) GROUP BY t.Years;
内容的提问来源于stack exchange,提问作者JD2775
相关产品推荐
相关产品推荐

