目前我有一个Web应用程序,用户可以使用下拉列表生成SQL SELECT语句,如下所示:
列选择下拉列表|运算符下拉(=!=><< => =)|值选择下拉列表
用户可以多次执行此操作,并且“过滤器”当前都已进行AND运算。
我想添加创建OR语句的可能性。在列相同的情况下,我可以很容易地添加OR,但是像
那样复杂的逻辑语句呢 <(>(或OR B或C)和(D或E))或(F和G)?如何让用户以用户友好的方式创建此类语句?
编辑:为一般受众指定,方便用户使用。目前,我与开发人员合作,偶尔为需要我们数据库中特定信息的非技术客户端手动编写SQL查询。我们的目标是通过为客户提供一个易于使用的工具来自行完成,这个网络应用程序将无需我们手动编码。
EDIT2:目前最终用户尚未使用该应用。我使用的唯一数据是以前的手写SQL查询,因此客户端要求的查询类型。鉴于我可以简化它(例如限制用户为他们倾向于要求的查询类型生成查询的能力),但我想看看是否有人在GUI中简单而完整地传达布尔逻辑的经验。
感谢您的时间。
答案 0 :(得分:24)
有一个jquery插件可以执行此操作,名为QueryBuilder,它以一种有趣的方式执行此操作:http://mistic100.github.io/jQuery-QueryBuilder/
答案 1 :(得分:14)
Apple似乎找到了一种为嵌套布尔表达式设计GUI的方法:请参阅 UX.stackexchange 上接受的答案。
答案 2 :(得分:7)
当您需要处理( (A or B) and C) or (D or E or F)
时,您正在使用树状数据结构。根据我的经验,没有简单的方法以“漂亮”或“直观”的方式向用户表示决策树。它在ASP.NET webforms中非常难。
但是,有一种经过验证的方法如下:单个文本框接受where子句。相信我,单输入法真的是最简单直观的用户界面,它还具有允许快速输入/修改查询过滤器的优势。
**从技术方面来说,另一个优势是可以编写自己的词法分析器/解析器和AST。你经常在一个基本的crud app中做到这一点:)*
您已经开始培训您的用户如何使用您的即席查询引擎,您也可以培训他们,键入(account.Balance < -2000 and account.Type == 'Checking') OR (account.Number = 123456)
会完全返回它返回的内容。
如果您采用这种方法,请向用户提供可用列的下拉列表,以便双击项目将项目插入光标位置的文本框中。
答案 3 :(得分:2)
老实说,在编写自定义&#34;其中&#34;,&#34; select&#34;,&#34;来自&#34;时,我看不到商业价值。或任何其他SQL命令代理。特别是,在这个特定的上下文(数据库访问和自定义查询)中,客户端打开了地狱的安全门。
让&#34;假人&#34; (我认为他不能使用常规SQL工具)撰写&#34;直观&#34;查询是一场等待发生的灾难。我猜BJ在2003年或2004年的俱乐部信用卡信息泡沫在精神上非常接近这一点。我猜(这只是一个猜测!)一些大营销老板说&#34;我们将保存信用卡条带信息,以便我们以后可以利用这些信息。&#34; &#34;您是否只希望在一个表格中公开提供信息,并且PII在统计上会被删除&#34; - 询问开发人员.....&#34;不,我们还不知道我们想如何使用这些信息,开发一种工具来以一种自定义的方式查询它......&#34 ;是通往灾难之路的第一块踏脚石。 :(
与此同时,组合/解析表达式需要UI(安全策略分析工具,布尔/开关代数研究等)肯定有些地方我认为最好的UI尚未创建(总是:)) ,但如果它被创建,我设想它有可能:
答案 4 :(得分:1)
Mac OS X提供了非常好的GUI小部件来完成这类事情。您可以在此类布局/交互之后对GUI进行建模。
答案 5 :(得分:1)
即使在WinForms应用程序中也难以表示。
您需要做的是实现条件组的概念,该条件组由一个或多个语句和条件运算符组成。
我看到的最好的实现是来自GameSpy服务器过滤 - 我只是试图搜索以找到屏幕截图,但我出现了空(该程序是否仍然存在?)。从我记得,他们做了这样的事情:
( Condition 1 ) OPERATOR ( Condition 2 ) OPERATOR ( ( Condition 3 ) OPERATOR ( Condition 4 ) )
答案 6 :(得分:1)
当我看到这样的问题时,我不禁想到将它实现为堆栈,类似于RPN如何解决这个问题。
这里的问题是它看起来不太直观
示例用户界面:([按钮]&lt;用户输入的文本框&gt; {list}
价值:&lt; &GT; [推] [和] [或]
栈 {
} (HP RPN计算器将堆栈放在编辑区域上方)
所以,如果我想写表达式((A和B)或(C和D)),我会这样做: 一个[推送](堆栈将包含“A”) B [推送](堆栈将包含“B”,“A”) [和](堆栈将包含“(A和B)”) C [push](堆栈包含“C”,“(A和B)”) D [推送](堆栈将包含“D”,“C”,“(A和B)”) [和](堆栈将包含“(C和D)”,“(A和B)”) [或](堆栈将包含“((A和B)或(C和D)”)
如果您想添加其他运算符,并且没有太多,您可以添加其他按钮,或为运营商创建单独的文本框
价值:&lt; &GT; [推] 运算符&lt; &GT; [合并]
如果你想支持一元运算符,你需要跟踪它是前缀或后缀运算符,还是只假设前缀(布尔一元运算符“not”通常是前缀)。三元运算符通常有两个中缀标识符,因此如果要支持它们会更复杂。一些二进制(和n-ary)运算符有一个前缀,中缀和后缀组件“CallMethod(A,B)”所以它实际上取决于你想要的复杂程度。
只有一个想法。
答案 7 :(得分:0)
另一个选项类似于SQL Server Management Studio查询构建器接口 - 几个行和列,其中行表示AND,列OR(反之亦然,我不记得)。
您可以对结果查询进行实时更新以帮助用户(就像SQL Server更新生成的SQL一样)。