基于Teradata使用CASE语句进行列值匹配与筛选
解决Teradata中多列值匹配的记录保留问题
针对你需要保留**任意初始列(Diag_Prefix、Diag2_Prefix、Diag3_Prefix)的值匹配任意目标列(Xref_Diag_Prefix、Xref_Dia2g_Prefix、Xref_Diag2_Prefix)**的记录需求,这里提供两种实用的Teradata SQL实现方案:
方法1:直观的OR+IN逻辑写法
这种写法逻辑清晰,容易理解和维护,适合快速落地需求:
SELECT * FROM your_table_name WHERE -- 检查Diag_Prefix是否匹配任意目标列 Diag_Prefix IN (Xref_Diag_Prefix, Xref_Dia2g_Prefix, Xref_Diag2_Prefix) OR -- 检查Diag2_Prefix是否匹配任意目标列 Diag2_Prefix IN (Xref_Diag_Prefix, Xref_Dia2g_Prefix, Xref_Diag2_Prefix) OR -- 检查Diag3_Prefix是否匹配任意目标列 Diag3_Prefix IN (Xref_Diag_Prefix, Xref_Dia2g_Prefix, Xref_Diag2_Prefix);
方法2:用数组交集简化代码(适合高版本Teradata)
如果你的Teradata版本支持ARRAY和CARDINALITY函数,可以用更紧凑的方式实现,减少重复代码:
SELECT * FROM your_table_name WHERE CARDINALITY( INTERSECT( ARRAY[Diag_Prefix, Diag2_Prefix, Diag3_Prefix], ARRAY[Xref_Diag_Prefix, Xref_Dia2g_Prefix, Xref_Diag2_Prefix] ) ) > 0;
这个逻辑是把初始列和目标列分别打包成数组,然后取两个数组的交集——如果交集的元素数量大于0,就说明存在匹配值,这条记录会被保留。
额外提示:处理NULL值干扰
如果列中可能存在NULL值,建议用COALESCE替换NULL为一个不会参与匹配的占位符,避免NULL导致的匹配异常:
SELECT * FROM your_table_name WHERE COALESCE(Diag_Prefix, '') IN (COALESCE(Xref_Diag_Prefix, ''), COALESCE(Xref_Dia2g_Prefix, ''), COALESCE(Xref_Diag2_Prefix, '')) OR COALESCE(Diag2_Prefix, '') IN (COALESCE(Xref_Diag_Prefix, ''), COALESCE(Xref_Dia2g_Prefix, ''), COALESCE(Xref_Diag2_Prefix, '')) OR COALESCE(Diag3_Prefix, '') IN (COALESCE(Xref_Diag_Prefix, ''), COALESCE(Xref_Dia2g_Prefix, ''), COALESCE(Xref_Diag2_Prefix, ''));
内容的提问来源于stack exchange,提问作者JoeX
相关产品推荐
相关产品推荐

