10

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

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

第一个解决方案允许在脚本中使用更简洁的代码,但对我来说似乎是错误的。

令人困惑的问题,我知道。让我知道我是否需要更清楚。

4

7 回答 7

10

不,SQL 优化器只会扔掉它1=1并继续前进。

于 2010-04-12T15:43:53.813 回答
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;";
?>
于 2010-04-12T15:44:56.907 回答
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)) : '';
于 2010-04-12T15:56:13.203 回答
1

1=1如果在某处进行了解释,我不会因为在 SQL 查询中看到 a 而太生气。

也就是说,如果我在 Python 中执行此操作,我可能会执行以下操作:

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

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

于 2010-04-12T15:46:58.613 回答
1

一般来说,在您真正遇到性能问题之前,我根本不会担心性能。

也就是说,类似的东西1=1可能会产生令人惊讶的性能后果。有关让我大吃一惊的示例,请参阅此问题。但话又说回来,在某些情况下,前缀1=1会使您的查询更快!聪明的程序员会根据测量进行优化。无法预测更改将如何影响性能。

于 2010-04-12T15:51:15.297 回答
1

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

于 2010-04-12T15:58:25.590 回答
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'"
于 2010-04-12T16:07:25.007 回答