Tenho uma tabela com dados que coletamos de várias fontes. Ela tem o nome do item, a fonte e o valor da fonte.
A tabela se parece com a seguinte:
eu ia | nome | fonte | valor |
---|---|---|---|
1 | abc | rede | 1 |
2 | abc | imprimir | 2 |
3 | xyz | imprimir | 8 |
4 | xyz | rede | 9 |
Usando a JSON_OBJECTAGG()
função, posso agrupar as fontes com base no nome:
SELECT name, JSON_OBJECTAGG(source, value) AS data
FROM testStuff
GROUP BY name
Isso dá corretamente:
nome | dados |
---|---|
abc | {"web":1, "imprimir": 2} |
xyz | {"imprimir":8, "web": 9} |
Agora, quero executar essa consulta, mas com um filtro no preço/fonte, então executei a seguinte consulta:
SELECT name, JSON_OBJECTAGG(source, value) AS data
FROM testStuff
GROUP BY name
HAVING JSON_CONTAINS(data, 2, '$.print')
Isso parece funcionar, mas há um pequeno problema:
nome | dados |
---|---|
abc | {"web":1, "imprimir": 2}} |
Por que de repente há um extra }
no final dos dados JSON? A HAVING
cláusula está filtrando corretamente as linhas, mas por que ela modifica os dados do resultado?
Demonstração online: https://sqlfiddle.com/mariadb/online-compiler?id=ccf1041c-3ada-4fc9-bd77-2b0fe1428392
Não tenho certeza de qual versão do MariaDB esse site usa, mas testar isso no meu computador local usando o MariaDB 10.11.9 dá os mesmos resultados.
EDIT : Parece que posso consertar isso usando:
SELECT name, JSON_OBJECTAGG(source, value) AS data
FROM testStuff
GROUP BY name
HAVING JSON_CONTAINS(JSON_OBJECTAGG(source, value), 2, '$.print')
Eu só estava tentando evitar escrever isso JSON_OBJECTAGG()
várias vezes. Além disso, embora isso corrija o problema, ainda estou curioso para saber por que isso era um problema em primeiro lugar.
EDIT 2 : Outra "correção" é substituir JSON_OBJECTAGG()
por GROUP_CONCAT()
.
O seguinte retorna os dados corretos:
SELECT name,
REPLACE(GROUP_CONCAT(JSON_OBJECT(source, value)), '},{', ',') AS data
FROM testStuff
GROUP BY name
HAVING JSON_CONTAINS(data, 2, '$.print')