使用 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。你从哪里得到代码?你真的试过了吗? 请编辑您的帖子,使各列与数据对齐,如果/
和-
没有执行任何操作,请丢失它们。很难了解您的数据是什么。同样正如其他人所提到的,@id
和 then 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 语句根据不同表中的数据显示数据的主要内容,如果未能解决你的问题,请参考以下文章