mysql - 如果value = 0则缩短where语句

时间:2012-04-10 14:18:53

标签: php mysql where

我想知道是否有可能以优雅的方式根据某些变量值缩短查询。

例如:我的值为$var = 0,我想发送一个如下所示的查询:

$query = "SELECT id, name, quantity FROM products WHERE quantity > 100";

但是$ var!= 1我想发送一个这样的查询:

$query = "SELECT id, name, quantity FROM products WHERE quantity > 100 AND id = '$var'";

因此,根据$ var的值,我想执行一个查询。它们仅与最后一个表达不同。 我发现了两种可能的解决方案,但它们并不优雅,我根本不喜欢它们。

一个用php制作:

if ( $var == 0 ) {
  $query_without_second_expression
} else {
  $query_with_second_expression
}

第二个是在mysql中创建的:

SELECT WHEN '$var' <> 0 THEN id, name, quantity 
FROM products WHERE quantity > 100 AND id = '$var' ELSE id, name, quantity 
FROM products WHERE quantity > 100 END

但我不喜欢它 - 每个想法在某些方面加倍查询。我可以这样做吗?

SELECT id, name, quantity 
FROM products WHERE quantity > 100 
CASE WHEN $var <> 0 THEN AND id = '$var' 

它更短,并在需要时添加部分查询。当然,真正的查询要复杂得多,并且真正期望更短的陈述。有人有想法吗?

9 个答案:

答案 0 :(得分:5)

如果我理解得很好..

$query = "SELECT id, name, quantity FROM products WHERE quantity > 100";
if ( $var != 0 ) {
  $query .= " AND id = '$var'";
}
你喜欢它吗?

答案 1 :(得分:2)

你可以在SQL端这样的事情:

"SELECT id, name, quantity FROM products WHERE quantity > 100 AND (id = '$var' OR '$var' = 0) 

但表现可能会受到影响。我建议在PHP端构建适当的查询。

答案 2 :(得分:1)

如果他们只在其他where语句中有所不同,我可能会继续使用PHP并执行以下操作:

$conditions = array();
$conditions[] = "(quantity > 100)"

if ($var == 0)
  $conditions[] = "(id = '$var')";

if (some-other-expression)
  $conditions[] = "(myfield = 'foo' OR myfield = 'bar')";

$sql = "
  SElECT id, name, quantity
  FROM products
  WHERE
";
$sql .= $conditions.join(" AND ");

/ Carsten

答案 3 :(得分:1)

我不是PHP开发人员(它是PHP,对吧?),但从串联字符串构建查询是否最简单?

的伪代码:

$my_query = "SELECT id, name, quantity FROM products WHERE quantity > 100"

if ($var != 1)
   $my_query = $my_query + " AND id = '$var'";
end if;

/*go ahead with your query*/

答案 4 :(得分:1)

你可以这样做:

SELECT id, name, quantity 
FROM products 
WHERE  1 = 1
       AND ( $q   IS NULL OR quantity > $q)
       AND ( $var IS NULL OR id = $var)

如果您只希望运行第一个条件,则传递$q = 100$var = NULL,因此第二个条件将被忽略。对于第二个查询传递$q = 100$var = id value,您将获得第二个查询。

答案 5 :(得分:1)

我会用这个三元组:

$query = "SELECT id, name, quantity FROM products WHERE quantity > 100" . ( $var != 0 ? " AND id = '$var'" : '' );

答案 6 :(得分:1)

我是Oracle人员,但您可以在约束中使用IF()函数,例如:

SELECT id, name, quantity
  FROM products
 WHERE quantity > 100
   AND id = IF('$var'=0,'%','$var');

'%'是一个匹配任何内容的通配符,实际上忽略了第二个表达式。

答案 7 :(得分:1)

所以,如果你正在使用

  

如果或CASE

为什么不在sql查询中使用它们。 这有点像

if ( $var == 0 ) {
$query_without_second_expression
}
else 
{
 $query_with_second_expression
}

但是在你的SQL查询中。

DECLARE @var int
if(@var=1)
BEGIN
    query 1
END

else 
BEGIN
     query 2
end

我想这会解决你的问题。 但作为个人建议尝试进行一个查询。即使有变量。我们不相信根据条件更改标准查询。

仍然是你的愿望和愿望

干杯!!

答案 8 :(得分:1)

对于这个特殊问题,请使用Paper-bat的简单条件追加代码段。

但是,如果where语句完全不同,请考虑在知道所需内容后将相应的where语句附加到查询中。例如,

$query = "SELECT id, name, quantity FROM products ";
if ( $var == 0 ) {
  $query .= "quantity > 100";
} elseif {
  $query .= "quantity > 120 AND id = '$var'";
} elseif {
...
}
...

这一切都取决于您的需求,但这个或Paper-bat的解决方案都不会重复查询代码。