在 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;
/
更新: 根据你最后的评论告诉 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;
/
我有一个 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;
/
更新: 根据你最后的评论告诉 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;
/