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


为什么这样做?
执行有特殊的好处吗?时间吗?
是否启用其他功能?
是否使用了与此类似的WHERE 1=1


#1 楼

基本上,这只是为了程序员的方便,因为您可以在之后添加AND...的附加条件,并且对执行时间没有影响。

请查看以下指向Stackoverflow的链接:


为什么有人会在SQL中使用WHERE 1 = 1 AND?
“其中1 = 1”
声明

请注意,WHERE 1是相同的至WHERE 1=1;都表示WHERE TRUE,但是前者由于不是真正的布尔值而被许多数据库管理系统拒绝。

#2 楼

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

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


还可以更轻松地以编程方式将内容固定到最后。 br />
否则,您必须先确定第一个选项...,然后让每个以下选项检查先前的选项。如果用户仅在上一个示例中选择了选项D,该怎么办?您必须确保if A, B and C aren't chosen然后使用WHERE否则使用and。以=开头,您可以将限定符拍到语句的末尾。

评论


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

– TomTom
2013年12月15日12:44

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

–WernerCD
2013年12月15日18:25



#3 楼


为什么要这样做?


由不太熟练的程序员编写的动态代码生成就浮现在我的脑海。

在哪里生成SELECT...。然后您必须拥有一些东西。...因此,与其仅在需要时添加WHERE,不如在不存在时添加一个非限制性条件。看到了这一点-负责解雇“专家”。

#4 楼

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

评论


没有人用WHERE 1 = 1来呼叫您的UDF;删除表的客户?

–闪烁
2013年12月13日在12:26

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

–场所
2013年12月13日在12:45

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

–亚瑟
2013年12月13日在12:48

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

–亚瑟
2013年12月13日14:23在

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

–茉莉
13年12月13日在17:09

#5 楼

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

#6 楼

从编程的角度来看,您从这里开始...
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);
        }


使事情变得更容易

评论


这是一个错误的查询。您的查询将类似于1 = 1 AND OR ...

– hakkikonu
19/12/27在12:36