SQL如何处理WHERE =任何
对于A股市场的应用程序,我编写了一个存储过程SQL如何处理WHERE =任何
SELECT [Stockname, Price]
FROM [StocksTable]
WHERE Currency IN [UserDefinedTableOfCurrencyCodes]
然而,当用户希望看到所有的价格与货币无关显然是低效的包括WHERE子句 - 但唯一/最好的方法来实现这一点,我可以看到的是在存储过程中有一个IF子句。
我是如此的低调以至于错过了更好的解决方案? (注意真正的应用程序有四种不同的可能的WHERE标准,而不仅仅是货币,所以IF逻辑可能会变得复杂PS>我意识到IF语句可以是web服务器甚至是前端,并指向不同的存储过程,但在这个开发阶段至少宁愿控制/设计在我的分贝)。编辑/更新:FYI显然,SQL Server将IN子句转换为一系列OR子句。
如果需要显示所有记录而不考虑货币,那么是的,您不需要WHERE子句。 如果你写一条说明WHERE货币IN([你拥有的每种货币])的条款,那么数据库可能会就像没有where条款那样处理(根据我的理解,但我可能是错的) 。
任何人都可以证实这一点?这听起来既合理又反直觉。 –
我想要其他人的意见。如果处理方式不同,我会感兴趣。它是如何反直觉的?如果WHERE子句包含每个可能的值,那么基本上不会使用WHERE子句过滤行。 – bbrumm
反直觉(对我来说)这样的功能的唯一方法将工作将是数据库逻辑做预检查每个WHERE子句(即值value =表中的所有可能的值),这将是un-必要的开销(尤其是因为如果我编写数据库逻辑,我会假设如果存在WHERE子句,则期望它执行某些操作是合理的)。现在,如果您只是在回答WHERE值=所有可能的实际影响的答案时,当然输出将是相同的 - 但会带来不必要的计算开销。 –
如果您有任何用户想要查看所有货币的参数,例如@ShowAllCurrency
,则可以像这样更改查询。如果@ShowAllCurrency == 1
等于true,sql不会查找IN部分。
有几种方法可以做到这一点。阅读Erland Sommarskog的一篇优秀文章[T-SQL中的动态搜索条件](http://www.sommarskog.se/dyn-search.html)。 –
感谢您的回复,我通读了这个链接,这是正确的主题。值得注意的是,对于未来的读者来说,链接描述了各种策略的优缺点,但为了我的目的,建议使用WHERE(CurrencyID ='@CurrencyID OR'@CurrencyID IS NULL)。 。 。 –