2011-05-04 14 views
5

Hey, tengo esta consulta en PL/SQL:PL/SQL opcional donde

--Ver todos los atributos de las OL de una OS. 
SELECT attr.swspattrdataid attr_data_id, 
     att.swname attribute_swname, 
     attr.swvalue attr_data_swvalue 
    FROM sw_sp_attr_data attr, 
     sw_sp_attribute att 
WHERE swobjectid IN (SELECT swsporderlineid 
         FROM sw_sp_order_line 
         WHERE swsporderid = 21444963 --Orden 
         **AND swsporderlineid = a_number** 
        ); 
    AND att.swspattributeid = attr.swspattributeid 
--AND att.swname LIKE '%%'       --Filtrar por nombre 

tengo que tener el filtro entre ** Y a ser opcional, así que no importa si pongo un número allí la la consulta se ejecuta bien, ¿es esto posible?

Gracias!

Respuesta

7

Declare el parámetro con un valor predeterminado de NULL. Entonces, en caso de que no se pase al procedimiento, será nulo automáticamente.

continuación, cambiar el estado a:

Y (a_number es nulo o swsporderlineid = a_number)

+0

La otra posibilidad es 'Y NVL (a_number, swsporderlineid) = swsporderlineid'. – angus

+0

@angus: Siempre que 'swsporderlineid' nunca sea nulo (probablemente sea lo mismo suponer esto). –

+0

@ Adam Paynter: Tienes razón. Cuando 'a_number es nulo y swsporderlineid es nulo', la condición a_horse_with_no_name (y la suya) devuelve true y la mía null. – angus

4

Puede sustituir la cláusula swsporderlineid = a_number con esta cláusula OR:

WHERE  swobjectid IN (SELECT swsporderlineid 
          FROM sw_sp_order_line 
          WHERE swsporderid = 21444963 --Orden 
           AND (swsporderlineid = a_number OR a_number IS NULL)); 

Por lo tanto, si a_number es nula, la segunda línea evalúa a true para todos los registros, lo que permite la consulta para continuar.