MySQL 其中子句等于任何内容(SELECT * WHERE col = ANY_VALUE)

2022-08-30 18:32:07

我想在MySQL中创建一个具有可选值的查询。指定该值后,查询将按该值进行筛选,如果该值不是所有行都返回。这个想法是这样的:

public function doQuery($item = 'ANY_VALUE') {
  $query = "SELECT * FROM table WHERE item = ?";
  db->fetchAll($query,array($item))
  ...
}

doQuery(); // Returns everything
doQuery($item='item1'); // Returns only rows where item = 'item1'

有没有一种简单的方法可以做到这一点,而无需根据$item的值创建两个查询字符串?


答案 1

据我所知,不存在这样的“任何”占位符。

如果你能使用LIKE,你可以做

SELECT * FROM table WHERE item LIKE '%'

如果可以附加条件,则可以按如下方式使子句无效:item

SELECT * FROM table WHERE item = ? OR 1=1

(但是,在您的示例中不起作用,因为您正在将“item”作为参数传递)

这就是我能看到的所有选项 - 使用两个查询可能最容易,在第二个查询中完全删除子句。WHERE

这可能有效,但我不确定从数据库的角度来看,这是否是一个好主意。

public function doQuery($item = 'ANY_VALUE') {
  $query = "SELECT * FROM table WHERE item = ? OR 1 = ?";
  db->fetchAll($query,array($item, ($item == 'ANY_VALUE' ? 1 : 0))
  ...
}

答案 2

更好的方法是首先从您需要打扰的参数生成sql查询,然后执行。

function doQuery($params) {
    $query = 'SELECT * FROM mytable ';
    if (is_array($params) // or whatever your condition ) { 
        $query .= 'WHERE item = ' . $params[0];
    }
    $query .= ' ;';

    // execute generated query
    execute($query);
}

推荐