在我设计的一个数据库模型中,有一个表,它的文本字段中有一个公式,这个公式表示一系列的复合运算。
下面是所述公式几个例子:
- 1i2e3
- (1i2)e(3i4)
1.每个字母代表一个复合运算符(i表示相交,e表示例外,u表示联合)
1.每个数字都是一个预先格式化的选择查询的参数
1.圆括号,像在常规数学公式中一样,表示解析的顺序
程序中的一个函数负责将该公式转换为有效的查询
问题:你会如何处理这些括号优先级在完整的查询?作为括号周围的选择查询只在某些特定的情况下工作,这不是我目前的一个。
让我们使用下面的公式作为转换函数的参数:(1i2)e(3i4)
预格式化的查询看起来像这样:
select pic_id
from pictags
where tag_id = ?
字符串
问号会被数字代替
这是调用和返回的文本
>>> translate("(1i2)e(3i4)")
... (
... select pic_id
... from pictags
... where tag_id = 1
...
... intersect
...
... select pic_id
... from pictags
... where tag_id = 2
... )
...
... except
...
... (
... select pic_id
... from pictags
... where tag_id = 3
...
... intersect
...
... select pic_id
... from pictags
... where tag_id = 4
... )
型
正如你所看到的,返回文本中的括号作为sql查询是无效的。虽然我可以用AND pic_id IN ([select statement])
替换intersect
,也可以用AND [expr] NOT IN ([select statement])
替换except
,但它确实使函数复杂化,这非常不优雅。
肯定有更好的方法来处理这些优先事项,不是吗?
1条答案
按热度按时间8nuwlpux1#
如果在公式的
(
之前添加SELECT pic_id from
,它将产生一组可以UNION,INTERSECTED和/或EXCEPT的结果行。