Plsql 如何在WHERE子句中实现案例选择

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和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中复制粘贴以下内容,我无法在添加注释时对其进行格式化,或者我不知道如何执行此操作。请在尝试询问更多问题之前阅读。