Gracias a todos, Os tengo que confesar que esta forma de trabajar es un poco rara, pero me he de adaptar a las especificaciones que me dan, que encima no son de nuestra empresa, cosas que pasan.
Finalmente, ya que me habéis ayudado a encontrar la solución, os cuelgo la consulta que hago , por si a alguien le interesa : SELECT string_agg(codigos.codigo_interno::varchar, '') FROM ( SELECT lpad(codigo_interno, 2, 0) as codigo_interno FROM productos WHERE" codigo_externo IN ( *SELECT a FROM generate_series(1, char_length('%s')) a WHERE substring('%s', a, 1) = '0')* AND codi_interno IS NOT NULL ORDER BY codi_interno) as codigos); Nota: %s --> bitmap --> 111000110000111010101101010..... Sin haberlo detallado en correos anteriores para no complicar el tema, lo que necesitava era que la query me devolviera el listado(como varchar) de nuestros códigos de productos autorizados del cliente validados por el 'bitmap' enviado por el servidor remoto, cuyos códigos son diferentes a los nuestros, y que sus códigos de productos corresponden a cada una las posiciones del bitmap. Vaya lio!!! jeje... Como podéis ver en negrita he optado por la solución de Fede, aunque he probado el resto.. Muy interesante la aportación de Alberto ya que me permitiría recorrer el bitmap de izquierda a derecha o de derecha a izquierda. Muchas gracias!!! Saludos. PD: Si alguna vez me convierto en experto de postgres, seré yo quien eche una mano, jejeje. Muchas gracias. 2014-02-17 17:03 GMT+01:00 Alvaro Herrera <alvhe...@2ndquadrant.com>: > Ruben Fitó escribió: > > Hola Jaime, > > > > concretamente necesito que a partir de un bitmap por ejemplo '101110..n', > > este bitmap se traduce a : > > > > 1 --> Codigo_producto_externo = 1 NO autorizado > > 0 --> Codigo_producto_externo = 2 autorizado > > 1 --> Codigo_producto_externo = 3 NO autorizado > > 1 --> Codigo_producto_externo = 4 NO autorizado > > 1 --> Codigo_producto_externo = 4 NO autorizado > > 0 --> Codigo_producto_externo = 5 autorizado > > . > > . > > n--> Codigo_producto_externo = posicion de n > > Me parece una manera poco feliz de codificar esta información, pero en > este caso podrías intentar sacar el bit correspondiente a cada número > entero > usando algo como lo siguiente: > > with bitmap as (select '10010010111000100'::varbit(17) as el_valor) > select i + 1, ((el_valor << i) & '10000000000000000')::varbit(1) > from bitmap, generate_series(0, length(el_valor) - 1) i; > > ?column? | varbit > ----------+-------- > 1 | 1 > 2 | 0 > 3 | 0 > 4 | 1 > 5 | 0 > 6 | 0 > 7 | 1 > 8 | 0 > 9 | 1 > 10 | 1 > 11 | 1 > 12 | 0 > 13 | 0 > 14 | 0 > 15 | 1 > 16 | 0 > 17 | 0 > (17 filas) > > > Lamentablemente no creo que esto funcione limpiamente en < 9.3 por falta > de LATERAL (el cual no se ve en la consulta, pero está implícito en el > hecho de usar el_valor como argumento de generate_series() que sólo > existe por el "from bitmap". Pero a lo mejor podrías imitarlo usando > más cláusulas WITH. > > O quizás hay formas aún más simples. > > -- > Álvaro Herrera http://www.2ndQuadrant.com/ > PostgreSQL Development, 24x7 Support, Training & Services > -- *Ruben Fitó * Software Engineer [image: Ubiquat Technologies, SL] r.f...@ubiquat.com<j.catari...@ubiquat.com> www.ubiquat.com Tota la informació continguda en aquest document i arxius adjunts és CONFIDENCIAL protegida per llei de secret comercial. Si l'ha rebut per error, si us plau elimini'l i posi's en contacte amb l'emissor. All information contained in this document and any attachments are CONFIDENTIAL and protected under trade secret laws. If you receive this message by mistake, please delete it and notify it immediately to the sender.