如何将复杂查询解析为sql?

qq24tv8q  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(362)

我想做一个高级搜索表单,用语法搜索。我已经找到了一个github存储库,它的实现与我想要的非常相似,但是我不能理解它的实现,所以我无法使它适应我的需要。我试图完成的搜索就是scryfall用来搜索mtg卡的搜索。下面是python中的测试列表,以便更好地理解我的意思:

'c:bm' => '((id IN (SELECT card_id FROM card_color WHERE color_id = 3)) AND (id IN (SELECT card_id FROM card_color GROUP BY card_id HAVING COUNT(card_id) > 1)))'
'c:u OR (c:g AND NOT tou>3)' => "(id IN (SELECT card_id FROM card_color WHERE color_id = 2)) OR ((id IN (SELECT card_id FROM card_color WHERE color_id = 5)) AND NOT (toughness IS NOT NULL AND toughness <> '' AND CAST(toughness AS REAL) > 3))"

我找不到任何资源来解释这是怎么做到的。我需要的是一个如何做的概述,这样我就可以自己做。这里有一个带代码的答案,但我自己写不出来。我需要理解它,这样我就可以调整代码,我已经找到我的需要。

7ajki6be

7ajki6be1#

不要担心问题的sql部分。我猜想,一旦有了搜索查询的解析树,生成sql条件就相当简单了。
因此,您当前的问题是解析搜索查询。假设这个特定语言还没有可用的解析器,您基本上有两种选择:
使用库/工具生成解析器(有很多选择,尤其是在python中。找一个有好教程的。)
自己写一个解析器(当然也不乏解释各种方法的资源。您可能会发现递归下降解析器最容易理解,我认为它适用于您的搜索查询。)
不管是哪种情况,我建议您首先为搜索查询语言编写语法。

相关问题