如何用SQL将位掩码的所有组合以行形式输出(替代列形式)
生成位掩码列的所有组合实现方案
方法1:基于现有表拆分后交叉连接
你的原表存储了每个位掩码列的非0值和全0行,先提取每个列的所有可能取值(包括0),再通过交叉连接生成所有组合:
SELECT bm1_vals.bm1, bm2_vals.bm2, bm3_vals.bm3 FROM (SELECT DISTINCT bm1 FROM your_table) bm1_vals CROSS JOIN (SELECT DISTINCT bm2 FROM your_table) bm2_vals CROSS JOIN (SELECT DISTINCT bm3 FROM your_table) bm3_vals ORDER BY bm1, bm2, bm3;
DISTINCT确保每个列只保留唯一合法取值,比如bm1只会得到0和1CROSS JOIN生成三个集合的笛卡尔积,正好覆盖所有可能的组合- 最后的
ORDER BY是可选操作,用来和你给出的示例结果顺序对齐
方法2:独立定义每个列的取值(更优方案)
如果不想依赖原表结构,直接定义每个位掩码列的合法取值,这种方式更可控,能避免原表数据缺失导致的问题:
SELECT bm1, bm2, bm3 FROM (SELECT 0 AS bm1 UNION ALL SELECT 1) bm1_vals CROSS JOIN (SELECT 0 AS bm2 UNION ALL SELECT 2) bm2_vals CROSS JOIN (SELECT 0 AS bm3 UNION ALL SELECT 4) bm3_vals ORDER BY bm1, bm2, bm3;
- 每个子查询直接列出对应列的所有允许值,比如bm2固定取0或2
- 新增位掩码列时,只需添加对应的
CROSS JOIN子查询即可,扩展性强
内容的提问来源于stack exchange,提问作者Paul M
相关产品推荐
相关产品推荐

