MySQL 8 - сортировка и фильтрация в JSON_ARRAYAGG - PullRequest
0 голосов
/ 03 мая 2018

Недавно я установил MySQL 8.0.11 GA и хотел оптимизировать некоторые представления, функции, ... Обычно у меня есть что-то вроде этого:

CREATE TABLE `PublicHoliday` (
  `PublicHoliday_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `PublicHoliday_Name` varchar(45) NOT NULL,
  `CompanyGroup_ID` int(2) unsigned NOT NULL,
  `Holiday` date NOT NULL,
  `State_ID` int(2) unsigned NOT NULL,
  PRIMARY KEY (`PublicHoliday_ID`),
  UNIQUE KEY `PublicHoliday_Comb` (`CompanyGroup_ID`,`Holiday`,`PublicHoliday_Name`,`State_ID`),
  CONSTRAINT `CompanyGroup_PublicHoliday` FOREIGN KEY (`CompanyGroup_ID`) REFERENCES `CompanyGroup` (`CompanyGroup_ID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

С MySQL 5.7 мне пришлось сделать что-то вроде

SELECT      CompanyGroup_ID,
            CAST(CONCAT('[',(
                GROUP_CONCAT(
                    DISTINCT JSON_OBJECT(
                        'Holiday', Holiday,
                        'PublicHoliday_Name', PublicHoliday_Name,
                        'PublicHoliday_ID', PublicHoliday_ID
                    )
                    ORDER BY Holiday ASC
                )
            ),']') AS JSON) AS HolidayArr
FROM        CompanyGroup
LEFT JOIN   Holiday
    USING(CompanyGroup_ID)
GROUP BY    CompanyGroup_ID

И теперь, когда MySQL 8.0.11 GA выпущен, я подумал об использовании JSON_ARRAYAGG () вместо всего приведения + concat + group_concat, но я не могу понять, как установить порядок или как его игнорировать дубликаты Кто-нибудь знает, есть ли способ выполнить какую-либо сортировку или фильтрацию в JSON_ARRAYAGG ()?

Кстати: я знаю, что можно достичь этого в rust, php, ... но я хочу добиться этого в SQL, чтобы иметь возможность использовать это в процедурах, функциях, событиях, триггерах, представлениях, ...

1 Ответ

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

Начиная с MySQL 8.0.14, JSON_ARRAYAGG () и другие JSON-функции могут использоваться в оконных функциях, где может быть указан порядок.

...