我正在做一些事情,发现这个 SQL,我不知道如何正确重写,这意味着使用 PHP PDO。
SQL 看起来像:
$sql = 'SELECT * FROM table WHERE column ' . isset($variable) ? . '=' . $variable : '>0';
基本上,查询的意思是:如果$variable
定义了(在 PHP 世界中),则使用=
.WHERE 条件,如果未定义,则使用>0
.
我可以在 PHP 上稍微清理一下,然后执行以下操作:
$where = $variable ? 'column = ?' : column > ?'; // ternary operator to build the proper where condition
$sql = 'SELECT * FROM table WHERE $where';
$db->row($sql, [$variable ?? 0]); // bind parameters to the query, PDO way, and the operator will use the value of $variable if it is defined otherwise it will use 0
我想它会工作得很好。现在,我想知道我是否可以使用普通 SQL 来实现相同的效果,就像 WHERE 中的条件与 SELECT 中的条件相同,如果可以,它是最佳的吗?或者以编程方式更好更快?
是的。
没有。
是的。
子句中的每个表达式
WHERE
称为谓词。表达式越复杂,SQL 引擎就越难优化。最终它会损害谓词的可控制性。可控制性是指谓词适用于高效索引查找操作的可能性的质量。不可控制的谓词可能会导致为查询提供数据的操作性能较低。如果可能的话,在应用程序端执行更复杂的逻辑来构造更简单的谓词通常会更好、更高效。
正如评论中所讨论的,这将是如何在纯 SQL 中逻辑构造类似谓词的伪代码:
操作
OR
符本质上是损害这里的可控制性的。人们可以使用运算符在纯 SQL 中更有效地重写它,UNION
如下所示:乍一看,查询同一个表两次似乎违反直觉,但引擎通常足够聪明,可以消除不适用的内容。例如,在这种情况下,变量要么有值,要么没有值,因此仅
UNION ALL
处理运算符的一侧。FWIW,这个伪代码实际上是 Microsoft SQL Server 的有效 T-SQL 语法(如果您最终在该系统中工作)。