Split string no MySQL

O MySQL não tem uma função para quebrar strings separadas por um determinado caractere (vírgula, por exemplo). A maioria das soluções que encontrei na web são baseadas em procedures. Não satisfeito com essa opção, fiz alguns estudos e cheguei à seguinte query:

SELECT DISTINCT 
SUBSTRING_INDEX(SUBSTRING_INDEX('1,2,3,4,5', ',', `i`), ',', -1) AS `val` 
FROM (
  SELECT @n := @n + 1 AS `i` 
  FROM `huge_table`, (SELECT @n := 0) `a` LIMIT 999
) `b`

Explicando:

  1. Geramos uma lista com valores de 1 até 999 (SELECT @n := @n + 1 AS `i` FROM `huge_table`, (SELECT @n := 0) `n` LIMIT 999). Aqui `huge_table` deve ser substituído pelo nome de uma tabela que tenha o número de registros (linhas) no mínimo igual ao valor especificado na cláusula LIMIT.
  2. Em seguida usamos esses valores no sequência de funções SUBSTRING_INDEX para extrair os valores da string.

Obs.: Você pode usar um valor menor (ou maior) no LIMIT se souber que a sua lista tem sempre menos (ou mais) valores.

Retrieving an hierarchical tree recursively with PL/PgSQL

From PostgreSQL 8.4 you can write WITH queries using the optional RECURSIVE modifier to make a query refer to its own output.

Ok, but if I’m using a previous version of PostgreSQL? What can I do? I had this same question and, after some research, I found a solution based on functions.

Below I’ll explain how the functions works. Continue reading “Retrieving an hierarchical tree recursively with PL/PgSQL”