如果子集组合返回null结果,则查询以获取超集?

时间:2017-07-04 09:41:07

标签: sql oracle postgresql

TABLE : **PROFILE**
RUN_ID| Type | code | gender | vacId

1     | A    | biz  | M      | 110
2     | A    | pro  | M      | 113
3     | A    | tot  | F      | 114

如果我输入,则根据输入返回vacId,如果代码+类型组合不存在则返回仅等于给定类型的vacId

  1. TYPE = A AND CODE = BIZ和GENDER = M,那么它应该返回110
  2. TYPE = A AND CODE = SYS则应返回110& 113,114没有A + SYS组合所以返回超集A的数据
  3. 如何为此编写一个查询,该查询现在可以在pgsql和oracle中使用。

    有没有办法可以使用 COALESCE

    实现这一目标

1 个答案:

答案 0 :(得分:1)

您可以使用条件where子句,例如($用于参数):

select p.*
from profile p
where case
    when exists (
        select 1
        from profile
        where type = $type and code = $code and gender = $gender
        )
    then type = $type and code = $code and gender = $gender
    else type = $type
    end;

更新

另一种解决方案可能是在单个json对象中获取结果,这将使您能够使用coalesce()

select coalesce(
    (select jsonb_agg(to_jsonb(p))
    from profile p
    where type = $type and code = $code and gender = $gender),
    (select jsonb_agg(to_jsonb(p))
    from profile p
    where type = $type)
);