基于AND、OR、NOT逻辑的只读数据库自定义过滤方案问询
优化多条件规则匹配的数据结构与查询方案(支持AND/OR/NOT与多选)
需求背景
基于用户对问题的答案,从只读数据库中匹配对应结果,规则需满足:
- 支持AND、OR、NOT逻辑运算符(比如某结果在问题答案不为指定值时触发)
- 问题答案为整数,支持多选(如Q2选3、4表示同时满足两个条件)
- 全量场景包含20-30个问题,逻辑规则一致
原规则定义示例
| ID | Q1 | Q2 | Result |
|---|---|---|---|
| 1 | 1 | 1 | 2 | A |
| 2 | 1 | 3 | B |
| 3 | 1 | 4 | C |
| 4 | 1 | 3 & 4 | D |
| 5 | NOT 1 | E | |
| ... | ... | ... | .... |
匹配规则示例
Q1: 1,Q2: 1->A(规则ID 1)Q1: 1,Q2: 2->A(规则ID 1)Q1: 1,Q2: 3->B(规则ID 2)Q1: 1,Q2: 4->C(规则ID 3)Q1: 1,Q2: 3, 4->D(规则ID 4)Q1: 2,Q2: 1->E(规则ID 5,Q2可任意或无值)
现有方案(宽表结构)
现有方案将OR逻辑拆分为多行,AND逻辑合并为排序后的数字(如Q2=34表示需同时选3和4),为每个问题新增_neg(是否取反)、_empty(是否忽略)字段,形成宽表:
| id | q1 | q1_neg | q1_empty | q2 | q2_neg | q2_empty | result |
|---|---|---|---|---|---|---|---|
| 1 | 1 | FALSE | FALSE | 1 | FALSE | FALSE | A |
| 1 | 1 | FALSE | FALSE | 2 | FALSE | FALSE | A |
| 2 | 1 | FALSE | FALSE | 3 | FALSE | FALSE | B |
| 3 | 1 | FALSE | FALSE | 4 | FALSE | FALSE | C |
| 4 | 1 | FALSE | FALSE | 34 | FALSE | FALSE | D |
| 5 | 1 | TRUE | FALSE | FALSE | TRUE | E |
查询示例(Q1=1、Q2=4时)
SELECT DISTINCT result FROM example_table WHERE (q1_empty OR (q1 = 1 and NOT q1_neg) OR (q1 != 1 AND q1_neg)) AND -- 匹配Q1=1的逻辑 (q2_empty OR (q2 = 4 and NOT q2_neg) OR (q2 != 4 AND q2_neg)); -- 匹配Q2=4的逻辑
测试表SQL
CREATE TABLE IF NOT EXISTS example_table ( id integer, q1 integer, q1_neg boolean, q1_empty boolean, q2 integer, q2_neg boolean, q2_empty boolean, result char ); INSERT INTO example_table(id, q1, q1_neg, q1_empty, q2, q2_neg, q2_empty, result) VALUES (1, 1, FALSE, FALSE, 1, FALSE, FALSE, 'A'), (1, 1, FALSE, FALSE, 2, FALSE, FALSE, 'A'), (2, 1, FALSE, FALSE, 3, FALSE, FALSE, 'B'), (3, 1, FALSE, FALSE, 4, FALSE, FALSE, 'C'), (4, 1, FALSE, FALSE, 34, FALSE, FALSE, 'D'), (5, 1, TRUE, FALSE, 0 , FALSE, TRUE, 'E');
该方案能返回正确结果,但数据结构过宽,当问题数量达到20-30个时,表字段会急剧膨胀,维护性差,现寻求更高效、合理的数据结构与查询组合方案。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

