我正在编写一个 PHP 脚本,它通过连接字符串并WHERE
根据需要向子句添加条件来构建 SQL 查询。
最好的做法是使用WHERE 1=1
以满足第一个条件并且脚本可以将 an 连接AND x = 'y'
到查询,或者我应该编写额外的代码来检查是否添加了子句,如果没有,添加AND
?
第一个解决方案允许在脚本中使用更简洁的代码,但对我来说似乎是错误的。
令人困惑的问题,我知道。让我知道我是否需要更清楚。
抢
不,SQL 优化器只会扔掉它1=1
并继续前进。
在确定需要哪些条件时创建一组条件。当您准备好构建查询时,检查数组是否为空......如果它不为空,则打印“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;";
?>
为了扩展 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)) : '';
1=1
如果在某处进行了解释,我不会因为在 SQL 查询中看到 a 而太生气。
也就是说,如果我在 Python 中执行此操作,我可能会执行以下操作:
query = (where_clauses or ["1=1"]).join(" AND ")
这样“真实”的查询就不需要奇怪的1=1
.
一般来说,在您真正遇到性能问题之前,我根本不会担心性能。
也就是说,类似的东西1=1
可能会产生令人惊讶的性能后果。有关让我大吃一惊的示例,请参阅此问题。但话又说回来,在某些情况下,前缀1=1
会使您的查询更快!聪明的程序员会根据测量进行优化。无法预测更改将如何影响性能。
虽然 1=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'"