sqlite 如何处理多重复合优先级?

krugob8w  于 12个月前  发布在  SQLite
关注(0)|答案(1)|浏览(124)

在我设计的一个数据库模型中,有一个表,它的文本字段中有一个公式,这个公式表示一系列的复合运算。
下面是所述公式几个例子:

  • 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,但它确实使函数复杂化,这非常不优雅。
肯定有更好的方法来处理这些优先事项,不是吗?

8nuwlpux

8nuwlpux1#

如果在公式的(之前添加SELECT pic_id from,它将产生一组可以UNION,INTERSECTED和/或EXCEPT的结果行。

相关问题