SQL - Equivalencia a un Or?

 
Vista:
sin imagen de perfil

Equivalencia a un Or?

Publicado por Yeison Asdrubal (15 intervenciones) el 09/07/2013 19:38:33
Hola amigos, Estoy usando un programa de oracle para crear reportes gerenciales llamado BI PUBLISHER tengo un inconveniente con una consulta Sql




La idea es consultar el producto, valor, tipo de producto donde el tipo de producto empiece por 1, 2, 3, 4, 5 (son varios los productos que empiezan por cada tipo de producto)

Normalmente se hace de una manera muy sencilla, Asi:

1
2
3
4
5
6
7
SELECT producto, valor, tipo_producto
FROM  tabla
WHERE tipo_producto like '1%'
OR tipo_producto like '2%'
OR tipo_producto like '3%'
OR tipo_producto like '4%'
OR tipo_producto like '5%'



Pero en el BI PUBLISHER no me funciona asi hay un bug o algo asi porque se queda procesando....

hay alguna otra alternativa en sql para lograr esto?
Ya lo intenté con
1
in (like '1%', like'2%')


GRACIAS...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Equivalencia a un Or?

Publicado por leonardo_josue (1173 intervenciones) el 09/07/2013 22:18:59
Hola Yeison Asdrubal:

Ojo, BI PUBLISHER no es una base de datos... es un reporteador...

1
Pero en el BI PUBLISHER no me funciona asi hay un bug o algo asi porque se queda procesando....


las comparaciones tipo LIKE son las que peor rendimiento tienen... en realidad la consulta no tiene nada de malo, por lo que eso de que se "quede procesando" puede indicar que en realidad el tiempo de respuesta sea muy elevado.

La cláusula LIKE no contempla la opción para hacer comparaciones tipo OR, pero podrías hacerlo de dos maneras, si en realidad sólo te interesa comparar el primer caracter, entonces podrías extraer ese caracter utilizando SUBSTR:

1
2
3
SELECT producto, valor, tipo_producto
FROM  tabla
WHERE SUBSTR(tipo_producto, 1, 1) IN ('1', '2', '3', '4', '5');



Otra opción sería utilizar expresiones regulares... estas si contemplan comparaciones tipo OR:

http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm

No tengo una BD de ORACLE para probar, pero creo que sería más o menos así:

1
2
3
SELECT producto, valor, tipo_producto
FROM  tabla
WHERE REGEXP_LIKE(tipo_producto, '^(1|2|3|4|5)$')


o como se trata de caracteres "seguidos" podrías colocar un rango:

1
2
3
SELECT producto, valor, tipo_producto
FROM  tabla
WHERE REGEXP_LIKE(tipo_producto, '^[1-5]$')


Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Equivalencia a un Or?

Publicado por Yeison Asdrubal (15 intervenciones) el 10/07/2013 22:57:17
Gracias por tu respuesta Leo, lo del SUBSTR funcionó perfecto...

- Una pregunta?: El REGEXP_LIKE, presenta buen rendimiento comparandolo con el like?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar