8

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

例如:我有一个名为的值$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' 

它要短得多,并在需要时添加部分查询。当然,真正的查询要复杂得多,并且确实可以预期更短的语句。有人有想法吗?

4

9 回答 9

5

如果我理解得很好..

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

你喜欢它吗?

于 2012-04-10T14:25:38.107 回答
2

你可以在 SQL 端这样做:

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

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

于 2012-04-10T14:27:37.173 回答
1

我是 Oracle 人,但你IF()能在你的约束中使用这个函数吗,例如:

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

'%' 是一个可以匹配任何内容的通配符,有效地忽略了第二个表达式。

于 2012-04-10T14:30:05.297 回答
1

因此,如果您使用

如果或案例

为什么不在你的 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

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

还是你的愿望和你的愿望

干杯!!

于 2012-04-10T14:31:41.900 回答
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 的解决方案都不会重复查询代码。

于 2012-04-10T14:33:12.303 回答
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 ");

/ 卡斯滕

于 2012-04-10T14:25:53.820 回答
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*/
于 2012-04-10T14:26:09.823 回答
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 = 100and $var = NULL,因此第二个条件将被忽略。对于第二个查询,通过$q = 100and$var = id value你将得到第二个查询。

于 2012-04-10T14:26:09.980 回答
1

我会为此使用三元:

$query = "SELECT id, name, quantity FROM products WHERE quantity > 100" . ( $var != 0 ? " AND id = '$var'" : '' );
于 2012-04-10T14:28:45.480 回答