【发布时间】:2021-03-02 03:55:19
【问题描述】:
我正在尝试遍历一个字典来自动生成 SQL WHERE 语句。下面是 dict 的示例以及所需的输出(已针对逻辑 OR/AND 运算符的使用进行了优化)。
有 5 个字段需要过滤(即 field1、field2、field3、field4、value5)。 dict 将过滤每个字段的值存储在元组中(其中 tuple[0] 和 tuple[1] 表示为过滤范围的下限和上限)。
您会在所需的输出(见下文)中注意到逻辑运算符已经过优化以消除任何冗余。例如,对于 GROUP1,field1 和 field2 的值(即分别为 40000 到 50000 和 0000 到 ZZZZ)在 WHERE 语句中只被引用一次,并且后跟一个 AND 运算符和一系列过滤器,其中 field3(及其对应的field4/field5 过滤器)由 OR 运算符分隔(即它在 field3 中需要过滤“分叉”和逻辑 OR 运算符)。对于 GROUP2,存在类似的结构;然而,field2 是这个“叉子”出现的地方。
input_range_dict = {
"GROUP1": {
(40000, 50000): { # field1
("0000", "ZZZZ"): { # field2
("000", "ZZZ"): { # field3
("10000000", "99999999"): # field4
[(123, 123), (456, 456)], # field5
("20000000", "40000000"): # field4
[("000", "ZZZ")]}, # field5
("AAA", "BBB"): { # field3
("10000000", "99999999"): # field4
[("000", "ZZZ")]} # field5
}
}
},
"GROUP2": {
(70000, 90000): {
("0000", "ZZZZ"): {
("000", "ZZZ"): {
("10000000", "99999999"):
[(123, 123), (456, 456)],
("20000000", "40000000"):
[("000", "ZZZ")]},
("AAAA", "ZZZZ"): {
("AAA", "BBB"): {
("10000000", "99999999"):
[("000", "ZZZ")]}
}
}
}
}
}
GROUP1 的输出字符串:
WHERE
field1 BETWEEN "40000" AND "50000"
AND field2 BETWEEN "0000" AND "ZZZZ"
AND
(
(
field3 BETWEEN "000" AND "ZZZ"
AND
(
(
field4 BETWEEN "10000000" AND "99999999"
AND
(
field5 BETWEEN "123" AND "123"
OR field5 BETWEEN "456" AND "456"
)
)
OR
(
field4 BETWEEN "20000000" AND "40000000"
AND field5 BETWEEN "000" AND "ZZZ"
)
)
)
OR
(
field3 BETWEEN "AAA" AND BBB"
AND field4 BETWEEN "10000000" AND "99999999"
AND field5 BETWEEN "000" AND "ZZZ"
)
)
GROUP2 的输出字符串:
WHERE
field1 BETWEEN "70000" AND "90000"
AND
(
field2 BETWEEN "0000" AND "ZZZZ"
AND field3 BETWEEN "000" AND "ZZZ"
AND
(
(
field4 BETWEEN "10000000" AND "99999999"
AND
(
field5 BETWEEN "123" AND "123"
OR field5 BETWEEN "456" AND "456"
)
)
OR
(
field4 BETWEEN "20000000" AND "40000000"
AND field5 BETWEEN "000" AND "ZZZ"
)
)
)
OR
(
field2 BETWEEN "AAAA" AND "ZZZZ"
AND field3 BETWEEN "AAA" AND "BBB"
AND field4 BETWEEN "10000000" AND "99999999"
AND field5 BETWEEN "000" AND "ZZZ"
)
【问题讨论】:
标签: python