Запрос кейса SQL с DISTINCT в ORC для cakephp3 - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь построить запрос кейса с отличным счетчиком в 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 Ответ

0 голосов
/ 01 февраля 2019

Использование ключевых слов в функциях уже довольно давно является проблемой, см., Например, следующую заявку: 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)))
...