sábado, 10 de enero de 2009

Listar las hojas de un arbol a partir de un nodo


Si tengo una tabla arbol y deseo listar solo los nodos hojas a partir de un nodo raiz, puedo utilizar la funcion que presento a continuacion, si se selecciona un nodo hoja, se mostrara a si mismo, pero no se mostraran nodos padres

POSTGRES SQL

CREATE OR REPLACE FUNCTION listar_hijos(_tabla text, _id_campo text
, _id_padre text, _id integer, _where text) RETURNS text AS $$
------------------------
-- Autor: Luis Jordan P.
------------------------
declare
  _sql text;
  _bucle record;
  _i integer;
  _ids text;
begin
  _sql := '
  SELECT a.' || _id_campo || ' as id  FROM '|| _tabla ||' a, '|| _tabla ||' b
  WHERE a.'|| _id_padre ||' = b.'|| _id_campo ||'
  AND b.' || _id_campo || ' = ' || _id
  || _where;
  raise notice 'sql:%',_sql;
  _i:=0;
  _ids := '';
  for _bucle in
    execute _sql
  loop
    _i:=_i+1;
    if (_id <> _bucle.id) then
      _ids := _ids || (SELECT * FROM listar_hijos(_tabla, _id_campo
      , _id_padre, _bucle.id, _where));
    end if;
  end loop;
  if (_i = 0) then  -- comentar el if si se desea que se incluyan los padres
    _ids := _ids || ',' || _id;
  end if;
  return _ids;
end;
$$ LANGUAGE 'plpgsql' VOLATILE;

--ejemplo con WHERE:
--SELECT listar_hijos('tabla', 'id_campo', 'id_campo_padre', 1, ' AND a.campo=''Luis'' ');


SELECT listar_hijos('tabla', 'id_campo', 'id_campo_padre', 1, ' ');
Resultado:
,4,8,9,6,7

No hay comentarios: