如果条件(PL / SQL)停留在条件上

问题描述 投票:1回答:2

仅当满足'if'条件时,我才想执行三个或更多delete语句。

我有这个查询,它得到几行,并且每一行都有一个称为last_update_date的列。看看:

SELECT PRODUCT_ATTR         as CATEGORY,
       product_attr_val     as COD_CATEGORY,
       qer.last_update_date
  FROM qp_modifier qer
  JOIN qp_list qar ON qar.list_header_id = qer.list_header_id
 ORDER BY qer.last_update_date desc

仅在last_update_date时,我才想执行这3条delete语句从上面的查询等于实际或实际上以前的查询天。

  delete from TABLE_PRODUCTS where product_id like 'WAL%';
  delete from TABLE_PRODUCTS where item_code like 'MAS%';
  delete from TABLE_PRODUCTS where customer_class_code='K' and customer_number is null;

我正在考虑做这样的事情:

  select max (last_update_date)
  into v_date
  from  qp_modifier

然后编写此语句:

  if v_date = sysdate  or v_date = sysdate - 1 then
      delete from TABLE_PRODUCTS where product_id like 'WAL%';
      delete from TABLE_PRODUCTS where item_code like 'MAS%';
      delete from TABLE_PRODUCTS where customer_class_code='K' and customer_number is null;
  end if;

但是对我来说这没有多大意义。

您将如何修改?

sql oracle sql-delete
2个回答
1
投票

如果使用delete,您将拥有一个 or

delete from TABLE_PRODUCTS
where product_id like 'WAL%' or
      item_code like 'MAS%' or
      customer_class_code = 'K' ;

然后,您可以包括其他存在条件:

delete from TABLE_PRODUCTS
where (product_id like 'WAL%' or
       item_code like 'MAS%' or
       customer_class_code = 'K'
      ) and
      (select max(qer.last_update_date)
       from qp_modifier qer join
            qp_list qar
            on qar.list_header_id = qer.list_header_id
      ) >= trunc(sysdate) - interval 1 day;

1
投票

max()功能是不需要的。满足if条件,条件是该连接查询的任何行exists列值qer.last_update_date的列值超过(或等于)前一天:

delete table_products
 where (    upper(product_id) like 'WAL%'
         or upper(item_code) like 'MAS%'
         or ( upper(customer_class_code) = 'K' and nvl(customer_number,0)=0 ) )         
   and exists (
               select 1
                 from qp_modifier qer
                 join qp_list qar on qar.list_header_id = qer.list_header_id
                where qer.last_update_date >= systimestamp - interval '1' day )

在不区分大小写的情况下,使用upper()包含与通配符模式匹配的所有数据是适当的。

© www.soinside.com 2019 - 2024. All rights reserved.