使用WHERE 1 = 1 AND构建SQL查询是不好的做法

时间:2010-04-12 15:42:02

标签: php sql where

我正在编写一个PHP脚本,通过连接字符串并根据需要向WHERE子句添加条件来构建SQL查询。

更好的做法是使用WHERE 1=1以便满足第一个条件并且脚本可以将AND x = 'y'连接到查询,或者我应该编写额外的代码来检查是否有子句已添加,如果没有,请添加AND

第一个解决方案允许在脚本中使用更干净的代码,但对我来说似乎不对。

令人困惑的问题,我知道。如果我需要更清楚,请告诉我。

罗布

7 个答案:

答案 0 :(得分:10)

不,SQL优化器只会抛出1=1并继续前进。

答案 1 :(得分:7)

在确定需要的条件时创建条件数组。当你准备好构建查询时,检查数组是否为空...如果它不为空,则打印“WHERE”,然后用“AND”连接在一起的元素。

修改

因为您正在使用PHP,所以我将提供一些示例代码:

<?php
    $conditions = array();
    if($foo == "bar") {
        $conditions[] = "some_table.foo = 'bar'";
    }
    if($show_future) {
        $conditions[] = "some_table.entry_date > NOW()";
    }
    $sql_where = count($conditions) ? "WHERE " . implode(" AND ", $conditions) : "";
    $sql = "SELECT * FROM some_table $sql_where;";
?>

答案 2 :(得分:2)

要扩展Ty W的答案,因为你正在使用PHP:

$clauses = array();

// Optionally add one or more clauses to the array like this:
$clauses[] = "test = 2";

// Now generate the WHERE clause:
$sql = 'SELECT * FROM Table ';
$sql .= count($clauses) ? ('WHERE ' . implode(' AND ', $clauses)) : '';

答案 3 :(得分:1)

如果在某些地方解释了SQL查询中的1=1,我不会太冒犯。

那就是说,如果我是用Python做的,我可能会做类似的事情:

query = (where_clauses or ["1=1"]).join(" AND ")

这样“真正的”查询就不需要奇怪的1=1

答案 4 :(得分:1)

一般情况下,在实际遇到性能问题之前,我根本不担心性能。

尽管如此,像1=1这样的东西可能会产生令人惊讶的性能后果。有一个例子让我感到惊讶,请参阅this question。但话说回来,还有一些前缀1=1会使您的查询更快的情况!明智的程序员根据测量进行优化。预测变化将如何影响绩效是不可能的。

答案 5 :(得分:1)

虽然1 = 1的东西并不漂亮,但代码生成器通常会做一些不漂亮的事情。如果这不是任何人需要维护或理解的代码(除了开发人员构建和调试发生器之外),那么我认为丑陋不重要。

答案 6 :(得分:1)

PHP为此提供了一个很好的小功能:implode。 (http://www.php.net/manual/en/function.implode.php

您可以按如下方式使用它:

$rawConditions = array("x='y'", "z='a'");
$conditions = "WHERE ".implode(" AND ", $rawConditions);
// $conditions == "WHERE x='y' AND z='a'"