Re: SELECT a partir de un BITMAP

From: Ruben Fitó <r(dot)fito(at)ubiquat(dot)com>
To: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>
Cc: Jaime Casanova <jaime(at)2ndquadrant(dot)com>, "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: SELECT a partir de un BITMAP
Date: 2014-02-18 12:09:04
Message-ID: CANiYpQy-Seco2hPigYYPRzp8xgksisieNhnhCG_BmGjV26c2jA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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 <alvherre(at)2ndquadrant(dot)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(dot)fito(at)ubiquat(dot)com<j(dot)catarineu(at)ubiquat(dot)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.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Lazaro Ruben Garcia Martinez 2014-02-18 16:03:08 Error extraño en llave foranea
Previous Message Alberto Cabello Sánchez 2014-02-17 17:42:16 Re: SELECT a partir de un BITMAP