【问题标题】:SQL: Handling multiple SELECT conditions?SQL:处理多个 SELECT 条件?
【发布时间】:2011-12-06 18:28:24
【问题描述】:

我只是一个基本的 SQL 用户(现在是 mySQL+php)。我有多个输入(条件)的搜索框。

例如:

颜色:____
大小:____
价格:___
条件:___
折扣百分比:___
命中数:___
等等,还有更多…………

用户可以输入 1 个或多个文件。
还应针对多个输入过滤结果。
那么,如何在 Query 中处理这多个条件呢?

我很困惑如何编写查询(以前的方式):
SELECT * FROM _item_ WHERE color='silver' AND/OR .... ... ????? ????

请提供一个简单的示例。

【问题讨论】:

    标签: sql select dynamic


    【解决方案1】:

    最简单的方法是有一个基本查询,即使没有过滤条件,仍然返回结果:

    SELECT * 
    FROM _item_ 
    WHERE 1=1
    

    然后,您可以轻松添加其他条件,以根据用户界面中指定的内容进一步过滤您的结果。因此,如果有人说他们想过滤颜色“银”和条件“新”,我们只需将它们添加到查询的WHERE 子句中:

    SELECT *
    FROM _item_
    WHERE 1=1
    AND color = 'silver'
    AND condition = 'new'
    

    每个额外的过滤条件都可以用AND 添加到基本查询的末尾。

    编辑: 正如其他帖子中所指出的,这是一种幼稚的方法,您需要小心 SQL 注入,但最初的问题要求提供一个简单的示例,这就像我一样简单能想到的。

    【讨论】:

    • 我建议这种方法有一个警告:使用参数化查询让 sql 引擎缓存执行计划并防止 sql 注入。
    • 您的查询是最好的,九边形。 :)
    【解决方案2】:

    没有一种简单的解决方案。您可以根据参数从头开始创建动态 SQL,也可以为每个参数组合使用不同的 SP,或者您可以获取所有内容,然后在客户端进行过滤或...

    但要非常小心 SQL 注入。

    我建议,在继续之前,您可以阅读 http://www.sommarskog.se/dyn-search.htmlhttp://www.sommarskog.se/dynamic_sql.html 提供了很多关于这类事情的细节。漫长但值得。

    【讨论】:

    • +1 :虽然这些参考文献很长,但这是因为以单一概括的方式有效地解决实际上是一个难题。简短的回答是,写动态 SQL - 但文章确实提到了一些需要小心的事情。
    【解决方案3】:

    您可以使用 COALESCE 动态构造 WHERE 子句,如果提供的参数为 null,则将使用列值,因此您只需确保在适当的地方传递 null:

    SELECT * FROM Table
    WHERE color = COALESCE(@Color,color)
    AND condition = COALESCE(@Condition,condition)
    

    请注意,这假设使用了参数化查询,因此应该是很好的 SQL 注入证明。

    【讨论】:

    • 我必须对此进行测试才能确定,但​​我认为这将导致每次都对整个表进行全面扫描 - 从来没有使用过索引。
    • 我不确定 MySQL,但我在 SQL Server 2000 中的这个查询的实现使用了没有表扫描的索引。
    猜你喜欢
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2011-08-28
    • 2021-06-05
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多