如何处理多个复合优先事项?

问题描述 投票:0回答:1

在我正在设计的数据库模型中,有一个表,其中包含包含公式的文本字段。 该公式代表一系列复合运算。

以下是该公式的几个示例:

  • 1i2e3
  • (1i2)e(3i4)
  1. 每个字母代表一个复合运算符(i 表示相交,e 表示例外,u 表示并集)
  2. 每个数字都是预格式化选择查询的参数
  3. 括号,就像在常规数学公式中一样,表示解析顺序

程序中的函数负责将该公式转换为有效的查询

问题:如何在完整查询中处理这些括号优先级?因为选择查询周围的括号仅在某些特定情况下有效,这不是我当前的情况。

让我们采用以下公式作为翻译函数的参数:

(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 查询无效。虽然我可以用

intersect
替换
AND pic_id IN ([select statement])
,也可以用
except
替换
AND [expr] NOT IN ([select statement])
,但它确实使函数变得复杂,这是非常不优雅的。

肯定存在更好的方法来解决这些优先事项,不是吗?

sqlite
1个回答
0
投票

如果在公式的

SELECT pic_id from 
之前添加
(
,它将生成一组可以进行 UNIONed、INTERSECTed 和/或 EXCEPTed 的结果行。

© www.soinside.com 2019 - 2024. All rights reserved.