为什么在Coldfusion中添加“AND 1 = 1”修复SQL查询?

时间:2012-05-16 20:32:52

标签: sql coldfusion cfquery

有几次我创建了一个cfquery,并且没有充分的理由,它不起作用。例如,我最近有这样的查询:

<cfquery name="get_projects" datasource="#application.dsn#">
        SELECT *
        FROM   projects
        WHERE  project_id = <cfqueryparam cfsqltype="cf_sql_integer" value="#project_id#">

          <cfif start_date NEQ "">
               AND project_start_date = <cfqueryparam cfsqltype="cf_sql_timestamp" value="#start_date#">
          </cfif>

        ORDER BY project_name
    </cfquery>

我确认start_date变量是一个空字符串。但是,我会得到一个指向该行的错误,并说“值无法转换为请求的类型”,即使它永远不会到达该行。

但是这里真的很奇怪......如果我在WHERE子句中添加“AND 1 = 1”,那么查询就可以完美地运行。

我在一些查询中偶尔会发生这种情况,但我不能说我认识到它的模式。始终是完美的查询。在某些情况下,查询之前正在运行,并且突然停止,可能是在文件中的其他位置发生更改时。我所要做的就是在WHERE子句中添加“AND 1 = 1”,然后再次工作。其他任何人遇到这个或有想法如何解决它?

5 个答案:

答案 0 :(得分:4)

它是许多开发人员使用的捷径,这是一个例子

select * from table where 1 = 1
<cfif x EQ 1>and x = 1</cfif>
<cfif y EQ 1>and y = 1</cfif>
<cfif z EQ 1>and z = 1</cfif>

这总是有效的。有条件和3 ifs。但如果所有的ands都是假的,你最终会得到查询:

select * from table where 1=1

即返回所有记录

如果您有一个或多个and,并且您没有1 = 1,那么您最终得到:

select * from table where and x = 1

..哪个不起作用。所以它只是一个简单的快捷方式,可以确保所有的工作都能正常工作,无论你是否需要0或全部。

答案 1 :(得分:2)

我认为查询无论如何都是正确的 - AND条款中没有ORWHERE组合这两部分。

答案 2 :(得分:1)

我看不出上面的查询是如何按原样运行的。

我在您的CFIF声明中添加了AND。这应该运行(修复cfqueryparams时。

SELECT *
FROM   projects
WHERE  project_id = <cfqueryparam>
       <cfif start_date NEQ "">
          AND project_start_date = <cfqueryparam>
      </cfif>
ORDER BY project_name

我经常使用这样的“AND 1 = 1”语句,其中我用1 = 1启动WHERE子句:

SELECT *
FROM   projects
WHERE  1 = 1
       AND project_id = <cfqueryparam>
       <cfif start_date NEQ "">
          AND project_start_date = <cfqueryparam>
      </cfif>
ORDER BY project_name

答案 3 :(得分:1)

我已经看到它发生在查询被错误编译并且更改其中的任何文本部分(例如添加1 = 1)重新编译它。

答案 4 :(得分:0)

IIRC,TimestampDate不同。如果您使用的是MSSQL Server,请参阅http://msdn.microsoft.com/en-us/library/ms182776(v=sql.90).aspx

<cfqueryparam cfsqltype="cf_sql_timestamp" value="#start_date#">

应该是

<cfqueryparam cfsqltype="cf_sql_date" value="#start_date#">

添加AND 1=1可能会导致服务器的查询优化器忽略整个WHERE谓词。