使用 case 语句根据不同表中的数据显示数据

Posted

技术标签:

【中文标题】使用 case 语句根据不同表中的数据显示数据【英文标题】:Display data based on data in a different table, using a case statement 【发布时间】:2016-10-06 22:01:03 【问题描述】:

我有多个表,其中一个具有 ID/Member/Type/UseDefault 列。 另一个表的列包含基于 ID 的人的描述性信息。

类型大多是默认的。在这种情况下,与 ID 对应的信息是完全可以的。如果 UseDefault 为 false(仅当类型不是默认值并且他们不想使用默认值时才会发生),那么提供的 ID 也是非常合适的。但是,如果 type 不是 default,但 use default 输入为 Yes,我需要显示与同一成员的默认 ID 关联的信息。

例如: 示例

ID  Member  Type   UseDefault

  1   joe    default    Y
  2   joe    additional Y 
  3   joe    third      N

如您所见...对于第 1 行,使用 Default 是 Yes,但类型已经是默认值。

在第 3 行,使用默认值为 No,因此您继续使用 ID 3。

但是在第 2 行。Use default 是 yes,并且 type 不是 default,所以我们需要找到 Joe 的默认类型的行。这是另一个表,以及我的查询的预期输出。

信息

ID   Car     Color  Food

  1  Benz    Red    Pizza
  2  Ferrari Green  Cheese
  3  Minivan Orange Hamburger

expected output:

Output

ID    Car     Color  Food

  1   Benz    Red    Pizza
  1   Benz    Red    Pizza
  3   Minivan Orange Hamburger

基本上我有

declare
id varchar2(2000)

Select I.Car, I.Color, I.FavoriteFood
from Info I 
full outer join Example e on e.id = i.id
where case id:= when (e.useDefault = 'N' AND e.Type <> 'Default') then (select id from example where e.name = name and e.type = default) else e.type end
and i.id = @id;

【问题讨论】:

“joe”作为成员标识符是否是成员的唯一标识符?否则你怎么知道哪些 'joe' 行是相互关联的,哪些来自不同的 Joe's? 会有其他名称,我包含该部分的唯一原因是因为会有一个带有默认值的 steve 和一个带有默认值以及其他值的 james 你没有理解我的问题。会有乔布朗和乔希尔吗?你怎么知道哪个 id (多个!)与哪个 joe 一起使用?您是否还有另一列用于 member_id,以区分一个乔和另一个? 您能确认一下您使用的是哪个数据库吗?您发布的代码不建议您标记的 Oracle。你从哪里得到代码?你真的试过了吗? 请编辑您的帖子,使各列与数据对齐,如果/- 没有执行任何操作,请丢失它们。很难了解您的数据是什么。同样正如其他人所提到的,@idthen set 在 Oracle 中无效,而且我没有看到任何 PL/SQL。 【参考方案1】:
with
     inputs ( id, member, type, usedefault ) as (
       select 1, 'joe', 'default'   , 'Y' from dual union all
       select 2, 'joe', 'additional', 'Y' from dual union all
       select 3, 'joe', 'third'     , 'N' from dual
     ),
     info ( id, car, color, food ) as (
       select 1, 'Benz'   , 'Red'   , 'Pizza'     from dual union all
       select 2, 'Ferrari', 'Green' , 'Cheese'    from dual union all
       select 3, 'Minivan', 'Orange', 'Hamburger' from dual
     ),
     defaults ( id, member ) as (
       select id, member
       from   inputs
       where  type = 'default'
     ),
     prep ( id_to_use ) as (
       select case when i.usedefault = 'N' then i.id
                   else d.id end   as id_to_use
       from   inputs i inner join defaults d on i.member = d.member
     )
select p.id_to_use as id, i.car, i.color, i.food
from   prep p left outer join info i on p.id_to_use = i.id
;

【讨论】:

以上是关于使用 case 语句根据不同表中的数据显示数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL 中的 Case 语句将数据插入临时表

如何将同一表中的总值显示为一行(在case语句中)?

case 语句中的多个条件重复表中的行

没有数据的 SQL CASE 语句

SQL学习Select语句:返回前多少行数据

Shell中的if和case判断语句