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
。以=
开头,您可以将限定符拍到语句的末尾。#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
评论
然后您用没有面向对象的语言编写了类似1980的代码,因为有人想到了基于对象的sql生成器的想法?
– TomTom
2013年12月15日12:44
我编写的代码类似于SSMS中的第一个块或类似的查询工具。研究数据集并获得正确的结果,然后再将其放入最终用户的报表工具(如Crystal Reports)中。第二个步骤是我见过其他人所做的事情,因为我的工作不是关于原始sql访问的。我已经给其他人类似的代码打了麻烦,并且可以理解其原因。 (代码在VB,C#和PHP中)。
–WernerCD
2013年12月15日18:25