36

目前我有一个 Web 应用程序,用户可以使用下拉列表生成 SQL SELECT 语句,如下所示:

列选择下拉| 运算符下拉菜单 (= != > < <= >=) | 值选择下拉菜单

用户可以多次执行此操作,并且“过滤器”当前都被“与”在一起。

我想添加创建 OR 语句的可能性。在列相同的情况下,我可以很容易地添加 OR,但是复杂的逻辑语句呢?

((A OR B OR C) AND (D OR E)) OR (F AND G)?

如何让用户以用户友好的方式创建此类语句?

编辑:要指定,对普通观众来说是用户友好的。目前,我与偶尔为需要来自我们数据库的特定信息的非技术客户端手动编写 SQL 查询的开发人员合作。目标是这个网络应用程序将通过为客户提供一个易于使用的工具来让我们自己编写代码,从而消除我们对它们进行手动编码的需要。

EDIT2:目前最终用户没有使用该应用程序。关于它的使用,我拥有的唯一数据是以前的手写 SQL 查询,因此是客户要求的那种查询。鉴于我可以简化它(例如,将用户生成查询的能力限制为他们倾向于要求的查询类型),但我想看看是否有人有在 GUI 中简单而完整地交流布尔逻辑的经验。

感谢您的时间。

4

9 回答 9

26

有一个 jquery 插件可以做到这一点,称为 QueryBuilder,它以一种有趣的方式做到这一点:http: //mistic100.github.io/jQuery-QueryBuilder/

Jquery QueryBuilder 截图

于 2016-03-22T13:38:36.980 回答
14

Apple 似乎找到了一种为嵌套布尔表达式设计 GUI 的方法:请参阅UX.stackexchange上接受的答案。

在此处输入图像描述

于 2013-02-03T15:29:17.127 回答
7

当您需要处理( (A or B) and C) or (D or E or F)时,您正在使用树状数据结构。以我的经验,没有简单的方法以“漂亮”或“直观”的方式向用户表示决策树。它在 ASP.NET 网络表单中加倍困难。

但是,一种经过验证的真实方法如下:接受 where 子句的单个文本框。相信我,单输入方法确实是最简单直观的用户界面,它还具有允许快速输入/修改查询过滤器的优势*。

** 从技术方面来看,另一个优势是能够编写自己的词法分析器/解析器和 AST。您多久在基本的 crud 应用程序中执行一次 :)*

您已经在培训您的用户如何使用您的即席查询引擎,您不妨培训他们,让他们知道键入(account.Balance < -2000 and account.Type == 'Checking') OR (account.Number = 123456)返回的内容与它所说的完全相同。

如果您采用这种方法,请为用户提供可用列的下拉列表,以便双击项目将项目插入光标位置的文本框中。

于 2009-11-09T20:56:29.233 回答
2

老实说,我没有看到编写自定义“where”、“select”、“from”或任何其他 SQL 命令代理的商业价值。特别是,在这个特定的上下文中(数据库访问和自定义动态查询),客户端打开了地狱的安全门。

让“傻瓜”(我认为他们无法使用常规 SQL 工具)组成“直观”查询是一场等待发生的灾难。我猜 BJ 在 2003 年或 2004 年的俱乐部信用卡信息萧条在精神上与此非常接近。我猜(这只是一个猜测!!!)一些大营销老板说“我们将保存信用卡条信息,以便我们以后可以利用该信息。” “您是否只想在一个表中公开可用的信息,并且对 PII 进行统计分桶”- 开发人员问道...... a CUSTOM WAY.....”是通往灾难之路的第一块踏脚石。:(

同时,肯定有一些地方需要 UI 来编写/解析表达式(安全策略分析工具、布尔/开关代数研究等)。我相信最好的 UI 尚未创建(总是:)),但如果它被创建,我设想它有可能:

  1. 解析表达式(应该是微不足道的,因为当用户逐个添加表达式块时,可以构建解析树)
  2. 以解析树形式显示表达式(绘制它应该很有趣)。
  3. 显示表达式呈现的 BF 的真/假表
  4. 绘制 BF 超立方体(对“类单调”函数特别有价值)
  5. 创建具有拓扑链接的卡诺图(尽管高维表达式祝你好运)
  6. 为表达式动态生成维恩图。
  7. 突出显示非必要变量或“表达式块”。
  8. 使用布尔表达式最小化的 McCluskey 或 Petrick 方法。
于 2014-06-16T18:09:19.283 回答
1

Mac OS X 提供了非常好的 GUI 小部件来完成这种类型的事情。您可以在这种类型的布局/交互之后为您的 GUI 建模。

于 2009-11-09T20:02:37.970 回答
1

即使在 WinForms 应用程序中也很难表示。

您需要做的是实现条件组的概念,它由一个或多个语句和一个条件运算符组成。

我见过的最好的实现是来自 GameSpy 服务器过滤——我只是试图搜索以找到一个屏幕截图,但我发现是空的(那个程序还存在吗?)。据我回忆,他们做了这样的事情:

(
    条件一
) 操作员
(
    条件 2
) 操作员
(
    (
        条件 3
    ) 操作员
    (
        条件 4
    )
)
于 2009-11-09T20:48:32.230 回答
1

当我看到这样的问题时,我不禁想到将其实现为堆栈,类似于RPN如何解决这个问题。

这里的问题是它似乎不太直观

Sample UI: ([Button] <a text box for user input> {list}

Value : < > [Push] [And] [Or]

Stack
{
    

}

(HP RPN 计算器将堆栈放在编辑区域上方)

所以,如果我想写表达式((A and B) or (C and D)),我会这样做:

A [push] (stack would contain "A")
B [push] (stack would contain "B", "A")
[and]    (stack would contain "(A and B)")
C [push] (stack would contain "C", "(A and B)")
D [push] (stack would contain "D", "C", "(A and B)")
[and]    (stack would contain "(C and D)", "(A and B)")
[or]     (stack would contain "((A and B) or (C and D)")

如果您想添加其他运算符,并且数量不多,您可以添加额外的按钮,或者为运算符创建一个单独的文本框

Value: < > [Push] Operator < > [Combine]

如果您想支持一元运算符,您需要跟踪它是前缀还是后缀运算符,或者只是假设前缀(布尔一元运算符“not”通常是前缀)。三元运算符通常有两个中缀指示符,因此如果您想支持它们,则会更加复杂。一些二元(和 n 元)运算符具有前缀、中缀和后缀组件“CallMethod(A,B)”所以它真的归结为你想要让它有多复杂。

只有一个想法。

于 2009-11-09T21:16:00.893 回答
0

另一种选择类似于 SQL Server Management Studio 查询构建器界面 - 多行和多列,其中行表示 AND,列表示 OR(反之亦然,我不记得了)。

您可以对生成的查询进行实时更新以帮助用户(就像 SQL Server 更新生成的 SQL 一样)。

于 2009-11-09T20:36:47.580 回答
0

属性过滤器表格(点击查看表格图片)

我有一个类似的任务,根据属性值过滤文件。用户是机械工程师,因此不完全是“普通观众”。

在表单中,用户创建了一组条件。每个都单独列出并分配一个字母(A,B,...)。

自动生成默认布尔表达式(A AND B AND ...)。但是,用户可以根据需要随意更改它,例如 A AND (B OR C)。

它已经投入生产一年多了,到目前为止没有出现重大的混乱或投诉。

于 2022-01-28T19:50:37.537 回答