SQL中满足多列条件时如何生成多条对应Line_Code记录?
实现多条件时生成多行记录的SQL方案
原来的CASE表达式每条记录只能返回一个Line_Code,没法在同时满足两个条件时生成两条记录。要达成需求,有两种常用方案:
方案一:用UNION ALL拆分条件查询
把两个条件分别写成独立的SELECT语句,再用UNION ALL合并结果,这样符合条件的记录都会被保留,包括同时满足两个条件时生成的两行:
SELECT unique_ID, '18' AS Line_Code FROM SampleTable WHERE Columna > '0' UNION ALL SELECT unique_ID, '06' AS Line_Code FROM SampleTable WHERE Columnb > '0' ORDER BY unique_ID, Line_Code DESC;
这段代码逻辑很直接:
- 第一个查询筛选出
Columna > '0'的记录,固定返回Line_Code = '18' - 第二个查询筛选出
Columnb > '0'的记录,固定返回Line_Code = '06' UNION ALL不会去重,所以同时满足两个条件的记录会生成两行结果- 最后加排序让输出更规整
方案二:用CROSS JOIN生成候选值再过滤
先构造一个包含目标Line_Code的临时数据集,和原表交叉连接后,再根据对应列的条件过滤掉不符合的组合:
SELECT s.unique_ID, c.Line_Code FROM SampleTable s CROSS JOIN ( SELECT '18' AS Line_Code, 'Columna' AS ColName UNION ALL SELECT '06' AS Line_Code, 'Columnb' AS ColName ) c WHERE (c.ColName = 'Columna' AND s.Columna > '0') OR (c.ColName = 'Columnb' AND s.Columnb > '0') ORDER BY s.unique_ID, c.Line_Code DESC;
这种方式的好处是如果后续需要新增更多Line_Code规则,只需要在临时数据集中加行就行,扩展性更强。
两种方案都能得到你期望的输出:当某条记录同时满足Columna > '0'和Columnb > '0'时,会生成两条对应不同Line_Code的记录。
内容的提问来源于stack exchange,提问作者Tbreezy
相关产品推荐
相关产品推荐

