如何在SQL临时表INSERT语句中结合LIKE子查询赋值?求更佳方案
解决思路与实现方案
你原来的代码存在问题:VALUES子句里的子查询如果匹配到多条routing_path记录,会直接抛出「子查询返回的值不止一个」的错误——因为VALUES里每个条目只能对应单行数据,无法处理多行结果。
正确实现方式
要同时插入静态映射行和满足LIKE条件的动态行,用UNION ALL把两部分数据合并后插入即可:
INSERT INTO #new_cohort (chosen_path, abr_cohort) -- 静态映射行 SELECT 'core', 'core' UNION ALL SELECT 'pod', 'core' UNION ALL SELECT 'Dynamic High - CORE', 'Core_High' UNION ALL SELECT 'Dynamic High - POD', 'Core_High' -- 满足条件的动态行 SELECT routing_path, 'vbc' FROM [bid].[propensity_path_cutoffs] WHERE routing_path LIKE '%vbc%' AND routing_path NOT LIKE '%Dynamic High%';
更优实现方案
方案1:分离静态映射规则(提升可维护性)
如果后续映射规则可能变动,把静态映射规则单独存为表变量,再和动态查询结果合并插入,可读性和可维护性更强:
-- 定义静态映射规则 DECLARE @static_mappings TABLE (chosen_path VARCHAR(100), abr_cohort VARCHAR(100)); INSERT INTO @static_mappings VALUES ('core', 'core'), ('pod', 'core'), ('Dynamic High - CORE', 'Core_High'), ('Dynamic High - POD','Core_High'); -- 合并静态规则和动态数据插入 INSERT INTO #new_cohort (chosen_path, abr_cohort) SELECT chosen_path, abr_cohort FROM @static_mappings UNION ALL SELECT routing_path, 'vbc' FROM [bid].[propensity_path_cutoffs] WHERE routing_path LIKE '%vbc%' AND routing_path NOT LIKE '%Dynamic High%';
方案2:全表统一映射(适合批量处理场景)
如果需要对propensity_path_cutoffs表的所有数据做统一映射,用CASE WHEN直接生成结果会更高效:
INSERT INTO #new_cohort (chosen_path, abr_cohort) SELECT routing_path AS chosen_path, CASE WHEN routing_path IN ('core', 'pod') THEN 'core' WHEN routing_path LIKE '%Dynamic High%' THEN 'Core_High' WHEN routing_path LIKE '%vbc%' AND routing_path NOT LIKE '%Dynamic High%' THEN 'vbc' ELSE '其他' -- 可自定义未匹配数据的映射值 END AS abr_cohort FROM [bid].[propensity_path_cutoffs];
内容的提问来源于stack exchange,提问作者ATMA
相关产品推荐
相关产品推荐

