Запрос кейса SQL с DISTINCT в ORC для cakephp3

Я пытаюсь построить запрос с отчетливым счетом в CakePHP 3.

Это запрос в SQL:

select COUNT(distinct CASE WHEN type = 'abc' THEN app_num END) as "count_abc",COUNT(distinct CASE WHEN type = 'xyz' THEN app_num END) as "count_xyz" from table;

В настоящее время я получил это далеко:

$query = $this->find();

$abc_case = $query->newExpr()->addCase($query->newExpr()->add(['type' => 'abc']),' app_num','string');
$xyz_case = $query->newExpr()->addCase($query->newExpr()->add(['type' => 'xyz']),'app_num','string');


$query->select([
    "count_abc" => $query->func()->count($abc_case),
    "count_xyz" => $query->func()->count($xyz_case),
]);

Но я не могу применить отличительные в этом коде.

1 ответ

Решение

Использование ключевых слов в функциях уже давно является проблемой, см., Например, этот тикет: https://github.com/cakephp/cakephp/issues/10454.

Это было несколько улучшено в https://github.com/cakephp/cakephp/pull/11410, так что теперь можно (не) использовать выражение функции для DISTINCT как своего рода обходной путь, то есть генерировать код вроде DISTINCT(expression), который работает, потому что круглые скобки игнорируются, так сказать, как DISTINCT это не функция!

Я не уверен, что это работает, потому что спецификации SQL явно разрешают использовать круглые скобки, как это (также действует как замена пробела), или потому что это побочный эффект, так что, возможно, проверьте это прежде, чем положиться на это!

При этом вы можете использовать обходной путь от связанного PR до тех пор, пока не будет добавлена ​​реальная поддержка ключевого слова функции агрегирования, то есть сделать что-то вроде этого:

"count_abc" => $query->func()->count(
    $query->func()->DISTINCT([$abc_case])
)

Это будет генерировать SQL, похожий на:

(COUNT(DISTINCT(CASE WHEN ... END)))
Другие вопросы по тегам