我正在编写一个PHP脚本,通过连接字符串并根据需要向WHERE
子句添加条件来构建SQL查询。
更好的做法是使用WHERE 1=1
以便满足第一个条件并且脚本可以将AND x = 'y'
连接到查询,或者我应该编写额外的代码来检查是否有子句已添加,如果没有,请添加AND
?
第一个解决方案允许在脚本中使用更干净的代码,但对我来说似乎不对。
令人困惑的问题,我知道。如果我需要更清楚,请告诉我。
罗布
答案 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'"