我正在编写一个查询,该查询将检索与一组条件匹配的数据。虽然这些标准的数量和价值尚不清楚。它可以是“name = username”和/或“date = today”和/或“title = hello”等等。
有近10种不同的标准,可能只有一种被选中,因为可能有10种,因此不太可能为每种情况编写查询。
MySql是否有这种情况的语法?如果不是,那么实现这一结果的最佳方式是什么?
答案 0 :(得分:3)
在准备查询时,必须修复WHERE子句中的列和表达式。没有办法在SQL中参数化列或表达式。
大多数人解决此问题的方法是编写应用程序代码,根据应用程序逻辑和变量向WHERE子句添加术语。换句话说,将SQL语法的片段附加到代码构造(如if ()
)内的字符串中。执行此操作的具体方法取决于您正在使用的编程语言。
为了帮助实现此技术,有时框架会提供查询构建器API。例如,我参与了Zend Framework,其中包含一个名为Zend_Db_Select的类。它可以帮助您将术语附加到查询中。结果只是一个字符串,然后您可以将其准备为SQL语句。
我不参与Drupal,但我在他们的在线手册中看到他们有一个API method for adding terms to an SQL WHERE clause,类似于我上面描述的内容。
我想如果你有一个键/值对的PHP关联数组,使得键是列名,值是要搜索的值,你可以这样做:
<?php
$query = ... // create the query object
$search_conditions = array(
name => "username",
date => "today",
title => "hello"
);
foreach ($search_conditions as $col => $val) {
$query = $query->condition($col, $val, "=");
}
$query->execute();
手册说:
条件对象由一个或多个条件片段组成,这些片段将全部由指定的连接连接。默认情况下,该连接是AND。
因此,您可以向查询添加零个,一个或多个条件,并跟踪它们,就像您编写了以下内容一样:
WHERE name = :name AND date = :date AND title = :title
当需要执行查询时,它会自动传递您为这些参数占位符提供的值(“username”,“today”,“hello”)。
答案 1 :(得分:1)
如果它必须是钱包SQL而不是客户端应用程序中动态构建的SQL字符串,那么另一种方法就是这样。
SELECT *
FROM Yourtable
WHERE (name=userNameParam OR userNameParam IS NULL) AND
(title=titleParam OR titleParam IS NULL) AND...
注意:如果您想在其中一个字段中实际搜索空值,这显然无效。