为什么使用WHERE 1或WHERE 1 = 1?


50

通常,如果查询语句中不需要条件,则不使用WHERE子句。但是我看到WHERE 1在许多地方都使用了子句,即使没有其他条件也是如此。

  • 为什么要这样做?
  • 执行时间是否有特定的好处?
  • 是否启用其他功能?
  • 使用WHERE 1=1类似于吗?

Answers:



15

我的主要用途是,它使在查询开发过程中更容易注释掉某些内容。我以,and开头:

SELECT
     A
--  ,B
    ,C
    ,D
--  ,E
FROM TABLE
WHERE 1=1
--  and B='This'
    and C='That'
--  and D is not null

还可以更轻松地以编程方式将内容添加到结尾。

this  = "SELECT * "
this += "FROM TABLE "
this += "WHERE 1=1 "
if user chooses option a then this += "and A is not null "
if user chooses option b then this += "and B is not null "
if user chooses option b then this += "and C is not null "
if user chooses option b then this += "and D is not null "

否则,您必须限定第一个选项...,然后让每个以下选项检查先前的选项。如果用户仅在上一个示例中选择了选项D,该怎么办?您必须确保if A, B and C aren't chosen再使用WHEREelse use and。随着=在一开始,你可以一巴掌预选赛语句的结束。


1
然后您用没有面向对象的语言编写了类似1980的代码,因为有人想到了基于对象的sql生成器的想法?
TomTom 2013年

我写的code类似于SSMS或类似查询工具中的第一个块。研究数据集并获得正确的结果,然后再将其放入最终用户的报表工具(如Crystal Reports)中。第二个步骤是我见过其他人所做的事情,因为我的工作不是关于原始sql访问的。我已经给其他人类似的代码打了麻烦,并且可以理解其原因。(代码在VB,C#和PHP中)。
WernerCD 2013年

10

我们为什么这样做?

我想到了由不太熟练的程序员编写的动态代码生成。

生成SELECT。可见-负责解雇“专家”。

还是那家伙在哪里强制性的事情;)

我看不到其他任何东西。


5

我在C ++ / C中为PostgreSQL编写了一堆用户定义的函数,供大型公司的其他人(超过10K的人)使用。我的函数有一个可选where参数:如果没有给出值,则不使用该子句。明确记录了这一点。不幸的是,没有人使用此功能,每个人都只使用提供where 1=1子句。从理论上讲这似乎是不明智的,实际上所有查询优化器都将这类语句排除在外。很难教育1万人。


3
没有人用WHERE 1=1; DROP TABLE CUSTOMERS
2013年

但是,我仍然找不到使用Where 1子句的概念。需要更多说明吗?因为我在执行时间上没有任何改善。
ursitesion 2013年

这与执行时间无关。它与人们编程的文化有关。有时,您的代码(由IT人员编程)被工程师使用。这些家伙有他们自己的方式来思考和调用您的代码
arthur 2013年

@Twinkles:这绝对是一个有趣的问题。这里有几点要注意。(i)数据库对于UDF是只读的(ii)我的函数通过一堆东西将几个表组连接在一起,并使用数据仓库开窗函数使情况更糟。这使得删除任何东西(尽管并非不可能)充满挑战,(iii)UDF用于预生产代码。这意味着它永远不会投入生产:如果功能在挑战中幸存下来,那么另一个部门将完全重写我们编写的所有内容
arthur 2013年

4
实际上,教育10,000人非常容易。错误地使应用程序失败。他们将立即停止做错事情。
茉莉花

2

使用“ where 1 = 1”可减少动态sql'where'子句生成所需代码的复杂性。否则,在创建“ where”子句时,您需要检查这是否是添加的每个组件的第一个组件。这是一个简单的代码模式,可以降低代码复杂度,并在可能的情况下降低代码复杂度,几乎总是正确的决定。


0

从编程的角度来看,这里是... 1 = 1的使用...在此处输入图片说明

在这样的情况下,当我需要在运行时构造查询时,查询可能很短或很长,我使用“ where 1 = 1 AND”

string criteria =string.Empty;
        if (txtc1.Text != "")
        {
            criteria += "criteria1=" + "'" + txtc1.Text + "' ";
        }
        if (txtc2.Text != "")
        {
            criteria += "OR criteria2=" + "'" + txtc2.Text + "' ";
        }
        if (ddl1.SelectedItem.Text != "")
        {
            criteria += "OR criteria3=" + "'" + ddl1.SelectedItem.Text + "' ";
        } if (ddl2.SelectedItem.Text != "")
        {
            criteria += "OR criteria4=" + "'" + ddl2.SelectedItem.Text + "' ";
        }
        if (ddl3.SelectedItem.Text != "")
        {
            criteria += "OR criteria5=" + "'" + ddl3.SelectedItem.Text + "' ";
        }
        if (ddl4.SelectedItem.Text != "")
        {
            criteria += "OR criteria6=" + "'" + ddl4.SelectedItem.Text + "' ";

        } 
        if (txtc1.Text == "")  
        {
            //criteria = criteria.Substring(2);
            criteria = criteria.Substring(2,criteria.Length-3);
        }
        if (criteria != string.Empty)
        {
            criteria = "where 1=1 AND " + criteria;
            //Response.Write("<script>alert('query constructed by you is : '+'" +criteria+ "');</script>");
            Response.Write(criteria);
        }

使事情变得容易

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.