我想知道是否有可能以优雅的方式根据某些变量值缩短查询。
例如:我的值为$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'
它更短,并在需要时添加部分查询。当然,真正的查询要复杂得多,并且真正期望更短的陈述。有人有想法吗?
答案 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的解决方案都不会重复查询代码。