Plsql 如何在WHERE子句中实现案例选择
我有两张桌子T1和T2 塞纳里奥1号: 表T1有一列C1,其值为terminal1、terminal2、terminal3 从T1中选择C1 终端1 终端2 终点站3 表T2有一列C2,其值为terminal1、terminal2 从T2中选择C2 终端1 终端2 塞纳里奥2号 表T2有时可能为空 从T2中选择C2 空的 空的 我的输出必须是 那么塞纳里奥一号呢 终端1 终端2 塞纳里奥2号什么时候到 终端1 终端2 终点站3 i、 e当表T1和T2有公共值时,我只需要匹配的值 及 当表T2有空值时,我需要所有的值Plsql 如何在WHERE子句中实现案例选择,plsql,oracle-sqldeveloper,Plsql,Oracle Sqldeveloper,我有两张桌子T1和T2 塞纳里奥1号: 表T1有一列C1,其值为terminal1、terminal2、terminal3 从T1中选择C1 终端1 终端2 终点站3 表T2有一列C2,其值为terminal1、terminal2 从T2中选择C2 终端1 终端2 塞纳里奥2号 表T2有时可能为空 从T2中选择C2 空的 空的 我的输出必须是 那么塞纳里奥一号呢 终端1 终端2 塞纳里奥2号什么时候到 终端1 终端2 终点站3 i、 e当表T1和T2有公共值时,我只需要匹配的值 及 当表T2有空
从表T1中,您的问题需要一些适当的格式,并详细说明您所面临的问题。我假设,您需要一个语句,它显示哪些值相交,如果它们不相交,则只显示表a。对于该子句,您需要使用内部联接和case结构。例如:
select
ter."HEATHROW_TERMINAL",
case
when lok."HEATHROW_TERMINAL" is not null then
'Terminal is in both tables'
else
'Terminalis only in main table'
end terminal_state
from
test_terminal_v ter,
test_lookup_v lok
where
ter."HEATHROW_TERMINAL" = lok."HEATHROW_TERMINAL"(+)
declare
type t_term_tab is table of number index by binary_integer;
l_term t_term_tab;
l_i number := 1;
begin
for l_rec1 in (
select
ter.terminal
from
test_terminal_v ter,
test_lookup_v lok
where
ter.terminal = lok.terminal)
loop
l_term(l_i) := l_rec1.terminal;
l_i := l_i + 1;
end loop;
if l_term.first is null then
l_i := 1;
for l_rec2 in (
select
ter.terminal
from
test_terminal_v ter)
loop
l_term(l_i) := l_rec2.terminal;
l_i := l_i + 1;
end loop;
end if;
end;
其中,测试_端子_v A的值为5,4,2,3,测试_查找_v B的值为4,2,3。
希望能有帮助
评论之后:有几种方法。1您可以使用临时表。创建一个,代码为:
begin
insert into test_term_tmp
select
ter.terminal
from
test_terminal_v ter,
test_lookup_v lok
where
ter.terminal = lok.terminal;
if sql%rowcount = 0 then
insert into TEST_TERM_TMP
select
ter.terminal
from
test_terminal_v ter;
end if;
end;
或2种使用类型,例如:
select
ter."HEATHROW_TERMINAL",
case
when lok."HEATHROW_TERMINAL" is not null then
'Terminal is in both tables'
else
'Terminalis only in main table'
end terminal_state
from
test_terminal_v ter,
test_lookup_v lok
where
ter."HEATHROW_TERMINAL" = lok."HEATHROW_TERMINAL"(+)
declare
type t_term_tab is table of number index by binary_integer;
l_term t_term_tab;
l_i number := 1;
begin
for l_rec1 in (
select
ter.terminal
from
test_terminal_v ter,
test_lookup_v lok
where
ter.terminal = lok.terminal)
loop
l_term(l_i) := l_rec1.terminal;
l_i := l_i + 1;
end loop;
if l_term.first is null then
l_i := 1;
for l_rec2 in (
select
ter.terminal
from
test_terminal_v ter)
loop
l_term(l_i) := l_rec2.terminal;
l_i := l_i + 1;
end loop;
end if;
end;
根据您的数据测试性能。希望有帮助。看来您需要的是一个左外连接。外部联接允许我们有条件地联接表 此版本的查询将返回SP_RETAIL_事务中所有行的STORE_TERMINAL_LOCATION,并仅返回SP_TEMP_LOOKUP.AIRPORT_TERMINAL的匹配值
谢谢你们,我想我找到答案了 选择不同的T1.C1、T2.C2 从T1到T2 其中T2.C2=T1.C1或T2.C2为空 在我的代码中它在哪里 选择不同的A.商店\航站楼\位置,B.机场\航站楼 来自SP_零售交易A、SP_临时查询B
其中B.AIRPORT\u TERMINAL=A.STORE\u TERMINAL\u LOCATION或B.AIRPORT\u TERMINAL为空 对不起,忘了提一下,两个表之间没有连接键是的,您的解决方案似乎只给出了左表中的所有值,我试图实现的是,我只需要相交或匹配值,如果有,并且当一个表中的所有值都为空时,我需要另一个表中的所有值hmmm。请编辑您的问题,以显示您所发布的样本数据的预期结果,以及导致不同结果集的备选样本数据。以下是详细说明。创建表SP_RETAIL_TRANSACTIONSTORE_TERMINAL_LOCATION varchar2;在SP_零售_交易值中插入“希思罗机场1号航站楼”;在SP_零售_交易值中插入“希思罗机场2号航站楼”;在SP_零售_交易值中插入“希思罗机场3号航站楼”;在SP_零售_交易值中插入“希思罗机场4号航站楼”;在SP_零售_交易值中插入“希思罗机场5号航站楼”;创建表SP_TEMP_LOOKUP AIRPORT_TERMINAL varchar2;在SP_TEMP_查找值中插入“希思罗机场终端1”;插入SP_临时_查找值“希思罗机场终端2”;插入SP_TEMP_查找值“希思罗机场终端3”;在SP_TEMP_查找值中插入“希思罗机场终端4”;从SP_RETAIL_事务A、SP_TEMP_查找B中选择A.STORE_TERMINAL_LOCATION、B.AIRPORT_TERMINAL_LOCATION,当A.STORE_TERMINAL_LOCATION在B.AIRPORT_TERMINAL中时,然后选择B.STORE_TERMINAL_LOCATION-当B.AIRPORT_TERMINAL为空时,仅选择匹配值,然后选择A.STORE_TERMINAL_LOCATION结束-如果B.AIRPORT\u TERMINAL为null,则返回A.STORE\u TERMINAL\u location的所有值。请在sql developer中复制粘贴以下内容,我无法在添加注释时对其进行格式化,或者我不知道如何执行此操作。请在尝试询问更多问题之前阅读。