在 Oracle 中需要有关 IF ELSE 条件的帮助

Need assistance with IF ELSE condition in Oracle

我有一个 table 的列表,我需要根据列名传递那些 table。 例如,如果我的 table 有 CLASSID 它将进入块 2,如果 table 有 OBJID 它将进入块 1,如果 table 有 KOPPKT 它将进入块 3,但是如果 table 同时具有 CLASSID 和 OBJID,它应该进入块 2 而不是块 1
同样,如果任何 table 有 KOPPKT 和 OBJID,它应该进入块 1 而不是块 3。 这里我面临将 table 发送到正确块的问题。
我正在尝试实现但未获得所需输出的代码。

desc TABLE1;
Name    Null     Type       
------- -------- ---------- 
CLASSID NOT NULL NUMBER(10) 
KOPPKT  NOT NULL NUMBER(10)
ID      NOT NULL NUMBER(10)

desc TABLE2;
Name    Null     Type       
------- -------- ---------- 
CLASSID NOT NULL NUMBER(10) 
OBJID   NOT NULL NUMBER(10) 

desc TABLE3;
Name    Null     Type       
------- -------- ---------- 
KOPPKT  NOT NULL NUMBER(10) 
OBJID   NOT NULL NUMBER(10) 

此处 Table1 和 table2 应该进入块 2,因为它具有 CLASSID,table3 应该进入块 1,因为它具有 OBJID

set serveroutput on
declare
v_exporttable VARCHAR2(100):='TABLE1';
v_name varchar2(100);
begin
FOR rec IN
  (
  select  distinct column_name from all_tab_cols
  where table_name = v_exporttable
  ) loop
  if (rec.column_name ='OBJID') then
   DBMS_OUTPUT.PUT_LINE('Table has OBJID'); /*  block 1 */
  elsif (rec.column_name ='CLASSID') then
   DBMS_OUTPUT.PUT_LINE('Table has Classid'); /*  block 2 */
  elsif (rec.column_name = 'KOPPKT') then
   DBMS_OUTPUT.PUT_LINE('Table has KOPPKT'); /*  block 3 */
  end if;
end loop;
end;
/

传递 Table1 我得到的第一个输出。这意味着它同时进入 block 2 和 block 3.but 我只想通过 block2

PL/SQL procedure successfully completed.

Table has Classid
Table has KOPPKT

同样,如果我通过 Table 2,我就会得到这个。这意味着它同时进入块 1 和块 2.but 我只想通过块 2

PL/SQL procedure successfully completed.

Table has OBJID
Table has CLASSID 

同样,如果我通过 Table 3,我就会得到这个。这意味着它同时进入块 1 和块 3.but 我只想通过块 2

PL/SQL procedure successfully completed.

Table has OBJID
Table has KOPPKT

我试过下面的情况还是不行

(rec.column_name ='OBJID' and rec.column_name <>'CLASSID')

使用 LISTAGG 找到您的 table 感兴趣的所有列,然后检查 CASE 语句中的各个组合。在 CLASSID 条件之前将条件放在 CLASSID 和其他东西上:

with tab_cols as (
  select table_name,
    listagg(column_name, '|') within group(order by 1) as cols
  from all_tab_cols
  where table_name in (<your list>)
    and column_name in ('CLASSID', 'OBJID', 'KOPPKT')
  group by table_name
)
select table_name,
  case
    when instr(cols, 'CLASSID') > 0 then 2
    when instr(cols, 'OBJID') > 0 then 1
    when instr(cols, 'KOPPKT') > 0 then 3
  end as block_number
from tab_cols

SQL 语句中的条件聚合可用于确定所需的块名称作为局部字符串变量:

SQL> SET SERVEROUTPUT ON 
SQL> DECLARE
  v_name        VARCHAR2(10);
  v_exporttable VARCHAR2(100);
BEGIN
  SELECT CASE WHEN SUM(CASE WHEN column_name IN ( 'CLASSID', 'OBJID' )
              THEN 1 
              ELSE 0 
          END) = 2 
              THEN 
                   'Block 2' 
              ELSE CASE WHEN SUM(CASE WHEN column_name IN ( 'KOPPKT', 'OBJID' )
                        THEN 1
                        ELSE 0
                         END) = 2
                        THEN 
                          'Block 1' 
                        ELSE 
                          'Block 3'
                    END         
               END 
    INTO v_name           
    FROM user_tab_cols
   WHERE table_name = v_exporttable;

  DBMS_OUTPUT.PUT_LINE('Returning Block Name is '||v_name);
END;
/

Demo

更新: 根据你最后的评论告诉 Table1 出错了......它应该去块 2 ,你可以重新排列代码为

DECLARE
  v_name        VARCHAR2(10);
  v_exporttable VARCHAR2(100);
BEGIN
  SELECT CASE WHEN SUM(CASE WHEN column_name = 'CLASSID'
              THEN 1 
              ELSE 0 
               END) > 0 
              THEN 
                   'Block 2' 
              ELSE CASE WHEN SUM(CASE WHEN column_name IN ( 'KOPPKT', 'OBJID' )
                        THEN 1
                        ELSE 0
                         END) = 2
                        THEN 
                          'Block 1' 
                        ELSE 
                          'Block 3'
                    END         
               END 
    INTO v_name             
    FROM user_tab_cols
   WHERE table_name = v_exporttable;

  DBMS_OUTPUT.PUT_LINE('Returning Block Name is '||v_name);
END;
/

Demo2