Sql 有条件地订购

Sql 有条件地订购,sql,oracle,Sql,Oracle,我有两个表,产品和类别。每个产品都与特定的类别相关,并且有一个到期日,该日期可能是空值 我想首先查询最快的到期日订购的所有产品。无效期产品最后一次订购的是具有特定名称的类别,如食品 更新(样本数据如下): 产品表: 类别表: 结果: 如果我理解正确,只需在顺序中使用null last: select c.category, p.* from products p join category c on p.? = c.? -- whatever the join keys

我有两个表,
产品
类别
。每个
产品
都与特定的
类别
相关,并且有一个
到期日
,该日期可能是
空值

我想首先查询最快的
到期日
订购的所有
产品。无效期产品最后一次订购的是具有特定名称的
类别
,如
食品

更新(样本数据如下): 产品表:

类别表:

结果:


如果我理解正确,只需在
顺序中使用
null last

select c.category, p.*
from products p join
     category c
     on p.? = c.?  -- whatever the join keys are
order by category, expiry_date nulls last

这不仅仅是关于排序,您希望排除一些日期为空的行,而是基于类别名称包括其他行;然后点剩下的:

select p.prod_id, p.name, p.expiry_date, c.cat_id
from product p
join category c on c.cat_id = p.cat_id
where (c.name = 'Food' or p.expiry_date is not null)
order by p.expiry_date desc nulls last;
where
条款不包括产品,除非产品属于“食品”类别,否则有效期无效。然后,order by就很简单了,虽然您希望它按降序排列,但您需要得到这些。。。呃。。。最后

使用CTEs中的示例数据演示:

with product (prod_id, name, expiry_date, cat_id) as (
  select 1, 'NAME1', date '2018-01-10', 1 from dual
  union all select 2, 'NAME2', date '2018-01-11', 2 from dual
  union all select 3, 'NAME3', date '2018-01-12', 3 from dual
  union all select 4, 'NAME4', null, 1 from dual
  union all select 5, 'NAME5', null, 2 from dual
  union all select 6, 'NAME6', date '2018-01-13', 2 from dual
  union all select 7, 'NAME7', date '2018-01-14', 2 from dual
  union all select 8, 'NAME8', null, 3 from dual
),
category (cat_id, name) as (
  select 1, 'Food' from dual
  union all select 2, 'Food1' from dual
  union all select 3, 'Food2' from dual
)
select p.prod_id, p.name, p.expiry_date, c.cat_id
from product p
join category c on c.cat_id = p.cat_id
where (c.name = 'Food' or p.expiry_date is not null)
order by p.expiry_date desc nulls last;

   PROD_ID NAME  EXPIRY_DAT     CAT_ID
---------- ----- ---------- ----------
         7 NAME7 2018-01-14          2
         6 NAME6 2018-01-13          2
         3 NAME3 2018-01-12          3
         2 NAME2 2018-01-11          2
         1 NAME1 2018-01-10          1
         4 NAME4                     1

建议使用示例数据和所需结果。添加一些示例表数据和预期结果-格式文本。同时显示您当前的查询尝试。。。。您似乎排除了某些行,这不仅仅是关于订购?请注意:NULLS LAST是Oracle中升序的默认值。谢谢您,但是过期日期为null的产品必须与特定类别相关,如
食品