如何选择条件为null的所有地方?

时间:2013-04-17 13:26:12

标签: php mysql sql

我有一个带有查询的PHP代码:

$query = "SELECT * FROM TDdb WHERE status = $status AND occupation =$occupation";

我将使用客户端应用程序的值状态和职业发送到此PHP代码。 当我发送状态和职业时,这都有效。但是如果我只发送状态而不是职业,我希望它返回行(我的意思是无论职业是什么)。

有没有人有任何建议? 我将不胜感激任何帮助。

PS:我想在没有if语句的情况下做,只是改变查询

6 个答案:

答案 0 :(得分:1)

就个人而言,我会创建一个基本查询并在任何地方附加条件,如下所示:

$sql = 'SELECT * FROM TDdb';
$conditions = array();
$args = array();

if ($action) {
    $conditions[] = 'status = :status';
    $args[':status'] = $status;
}

if ($occupation) {
    $conditions[] = 'occupation = :occupation';
    $args[':occupation'] = $occupation;
}

if ($conditions) {
    $sql .= ' WHERE ' . join(' AND ', $conditions);
}

$stmt = $db->prepare($sql);
$stmt->execute($args);

答案 1 :(得分:1)

看起来你在SQL中有一些很好的选择,或者如何在PHP中创建SQL字符串变量。

考虑在PHP代码中使用“if”来获取数据库访问性能的一个原因。

当您在SQL中引入类似的'或'条件时,您将无法获得索引访问权限。数据库确定应该采用哪种路径比使用PHP代码要困难得多,因为SQL引擎在不知道变量将在执行时解析的内容的情况下优化查询。

您已经在PHP中知道您真正想要的查询版本。如果您在那里做出选择,这将表现得更好。

答案 2 :(得分:0)

如果您传递职业或NULL值,这将有效。

SELECT * 
FROM   TDdb 
WHERE  status = $status 
       AND ($occupation IS NULL OR occupation = $occupation)

答案 3 :(得分:0)

"SELECT * FROM TDdb WHERE status = '$status' AND (occupation = '$occupation' OR occupation IS NULL)";

答案 4 :(得分:0)

除了@Tom和@Damien Legros提供的解决方案之外,您可以创建两个查询字符串,一个带有占用,一个带有占用。类似的东西:

$query = "SELECT * FROM TDdb WHERE status = $status";
if ($occupation != "") { 
   /*When you have value for occupation*/
   $query .= " AND occupation =$occupation";
}

因此,在这种情况下,如果您只有状态字段,则会返回数据。其次,请检查表中的状态和职业字段是否为varchar,然后您必须将它们用单引号(')括起来。

答案 5 :(得分:0)

感谢大家的帮助。特别杰克。 最后我创建了我的查询:

$query = 'SELECT * FROM TDdb';

if ($status) {
    $query = $query." WHERE status = '".$status."'";
}

if ($occupation) {
    $query = $query." AND occupation = '".$occupation."'";
}