如何有条件地选择聚合函数返回值?

时间:2017-02-01 13:24:57

标签: mysql cakephp aggregate-functions cakephp-3.0 query-builder

目前,我这样询问最小值和最大值:

$query = $query
    ->where(['date >=' => $today])
    ->select([
        'minvalue' => $this->Daten->find()->func()->min('brennstoff'),
        'maxvalue' => $this->Daten->find()->func()->max('brennstoff')
    ])
    ->hydrate(false)
    ->toArray();

有时最小值或最大值可能是NULL,因此没有结果;但是我想要发出0(零)。

在SQL中,我使用IF(MIN(value), MIN(value), 0))。但是如何在ORM语法中翻译它?

1 个答案:

答案 0 :(得分:0)

IF非常具体,我建议使用CASE表达式,CakePHP支持的所有SQL方言都能理解这一点。

虽然查询构建器可以通过函数构建器简单地调用具有相同名称的魔术方法来创建任何类型的SQL函数调用,例如:

$minValue = $query->func()->IF([
    $query->newExpr()->isNotNull($query->func()->min('brennstoff')),
    $query->func()->min('brennstoff'),
    0
]);

$maxValue = $query->func()->IF([
    $query->newExpr()->isNotNull($query->func()->max('brennstoff')),
    $query->func()->max('brennstoff'),
    0
]);

IFNULL更紧凑的事情:

$minValue = $query->func()->IFNULL([
    $query->func()->min('brennstoff'),
    0
]);

$maxValue = $query->func()->IFNULL([
    $query->func()->max('brennstoff'),
    0
]);

CASE表达式有具体的辅助方法:

$minValue = $query
    ->newExpr()
    ->addCase(
        [$query->newExpr()->isNotNull($query->func()->min('brennstoff'))],
        [$query->func()->min('brennstoff'), 0],
        [null, 'integer']
    );

$maxValue = $query
    ->newExpr()
    ->addCase(
        [$query->newExpr()->isNotNull($query->func()->max('brennstoff'))],
        [$query->func()->max('brennstoff'), 0],
        [null, 'integer']
    );

$query = $query
    ->select([
        'minvalue' => $minValue,
        'maxvalue' => $maxValue
    ])
    // ...

另见