Probando un sistemita para la gestión de menus de forma dinámica [0] que está para mysql (y en un framework llamado p4a) he querido pasar la estructura sql a postgresql, pero me he conseguido con un comportamiento diferente.
De entrada, para su uso en mysql se utiliza concat_ws, que no existe en postgresql, más en las listas de discusión se proponen implementarla cada quien la necesite, de donde obtuve[1], luego de haber buscado brevemente[2]
La estructura de las tablas es bien sencilla:
Código:
En ambos casos, ejecuta la consulta:CREATE TABLE menu ( id serial NOT NULL, parent_id int default NULL, name text, label text, position int default NULL, visible smallint default '1', access_level text, action text, param1 text, PRIMARY KEY (id) ); INSERT INTO menu (id, parent_id, name, label, position, visible, access_level, action, param1) VALUES (1, NULL, 'admin', 'Admin', 1, 1, '10', NULL, NULL), (2, 1, 'p4a_users', 'Users', 1, 1, '10', 'openMask', NULL), (3, 1, 'p4a_menu_mask', 'Menu', 1, 1, '10', 'openMask', NULL), (4, NULL, 'basicas', 'Básicas', 2, 1, '6', NULL, NULL), (5, 4, 'agricola', 'Producción y Servicios Agrícolas', 2, 1, '6', NULL, NULL), (6, 4, 'servicios', 'Servicios Públicos', 2, 1, '6', NULL, NULL), (7, 6, 'electricidad', 'Electricidad', 2, 1, '6', 'openMask', NULL), (8, 5, 'pvegetal', 'Producción Vegetal', 2, 1, '6', 'openMask', NULL); ;
Código:
En mysql obtengo:SELECT concat_ws('->',c.label,b.label,a.label) FROM menu AS a LEFT JOIN menu AS b ON a.parent_id = b.id LEFT JOIN menu AS c ON b.parent_id = c.id
Código:
En postgresql:concat_ws('->',c.label,b.label,a.label) Admin Admin->Users Admin->Menu Básicas Básicas->Producción y Servicios Agrícolas Básicas->Servicios Públicos Básicas->Servicios Públicos->Electricidad Básicas->Producción y Servicios Agrícolas->Producción Vegetal
Código:
Algún comentario?concat_ws ----------- (3 filas)
[0]http://www.mechanicamente.it/content/view/15/8/
[1]http://archives.postgresql.org/pgsql-admin/2003-08/msg00042.php
[2]http://search.postgresql.org/search?m=1&q=concat_ws&l=&d=&s=