基于部分字符串关联数据表ID列的实现方案咨询
处理Table A与Table B的ID关联(兼容多分隔符后缀)
针对Table A的ID存在.或:后缀、需提取第一个分隔符前内容关联Table B的场景,给你几个实用方案:
方案1:用CHARINDEX+LEFT精准截取
通过判断两种分隔符的出现位置,取最先出现的那个作为截断点,没有分隔符则保留原ID:
SELECT a.*, b.* FROM TableA a JOIN TableB b ON LEFT(a.ID, CASE WHEN CHARINDEX('.', a.ID) > 0 AND CHARINDEX(':', a.ID) > 0 THEN MIN(CHARINDEX('.', a.ID), CHARINDEX(':', a.ID)) - 1 WHEN CHARINDEX('.', a.ID) > 0 THEN CHARINDEX('.', a.ID) - 1 WHEN CHARINDEX(':', a.ID) > 0 THEN CHARINDEX(':', a.ID) - 1 ELSE LEN(a.ID) END ) = b.ID
方案2:用PATINDEX简化逻辑
PATINDEX支持通配符匹配,能一次性定位第一个.或:,代码更简洁:
SELECT a.*, b.* FROM TableA a JOIN TableB b ON LEFT(a.ID, ISNULL(NULLIF(PATINDEX('%[.:]%', a.ID), 0) - 1, LEN(a.ID)) ) = b.ID
PATINDEX('%[.:]%', a.ID)返回第一个分隔符的位置,无分隔符则返回0NULLIF将0转为NULL,再用ISNULL替换成ID长度,确保无分隔符时取完整ID
方案3:兼容STRING_SPLIT的变通写法
如果一定要用STRING_SPLIT,先把两种分隔符统一成一种,再拆分取第一部分:
SELECT a.*, b.* FROM TableA a CROSS APPLY (SELECT TOP 1 value FROM STRING_SPLIT(REPLACE(a.ID, ':', '.'), '.') ) AS split_id JOIN TableB b ON split_id.value = b.ID
先把所有:替换为.,再按.拆分,取拆分结果的第一行作为关联ID。
内容的提问来源于stack exchange,提问作者JLuu
相关产品推荐
相关产品推荐

