如何在WHERE子句中实现CASE SELECT

时间:2017-05-16 10:23:08

标签: plsql oracle-sqldeveloper

我有两张表T1T2

Senario 1:

表T1具有列C1,其值为terminal1,terminal2,terminal3

从T1中选择C1

候机楼

候机楼

Terminal3

表T2的列C2的值为terminal1,terminal2

从T2中选择C2

候机楼

候机楼

Senario 2

表T2有时可以为空

从T2中选择C2

(空)

(空)

我的输出必须

当Senario 1然后

候机楼

候机楼

当Senario 2然后

候机楼

候机楼

Terminal3

即当表T1和T2具有共同的值时,我只想要匹配的值

当表T2具有空值时,我想要所有值  来自表T1

3 个答案:

答案 0 :(得分:0)

您的问题需要一些正确的格式,并详细说明您所面临的问题。我假设,您需要一个语句,它显示了哪些值相交,如果它们不相交 - 只显示表A.对于该子句,您需要使用内部连接和案例结构。例如:

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"(+)

,test_terminal_v(A)具有值" 5"," 4"," 2"," 3"和test_lookup_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)使用类型,例如:

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;

根据您的数据测试效果。希望它有所帮助。

答案 1 :(得分:0)

看来你需要的是一个左外连接。外连接允许我们有条件地连接表。

此版本的查询将针对STORE_TERMINAL_LOCATION中的所有行返回SP_RETAIL_TRANSACTION,并仅匹配SP_TEMP_LOOKUP.AIRPORT_TERMINAL的值。

SELECT DISTINCT A.STORE_TERMINAL_LOCATION, B.AIRPORT_TERMINAL
FROM SP_RETAIL_TRANSACTION A,
left outer join SP_TEMP_LOOKUP B
    on A.STORE_TERMINAL_LOCATION = B.AIRPORT_TERMINAL

答案 2 :(得分:0)

谢谢大家,我想我找到了答案

选择不同的T1.C1,T2.C2

来自T1,T2

其中T2.C2 = T1.C1或T2.C2为空;

我的代码中的位置是

选择不同的A.STORE_TERMINAL_LOCATION,B.AIRPORT_TERMINAL

来自SP_RETAIL_TRANSACTION A,SP_TEMP_LOOKUP B

其中B.AIRPORT_TERMINAL = A.STORE_TERMINAL_LOCATION或B.AIRPORT_TERMINAL为空;