Sql 空输出将被下一个输出覆盖

Sql 空输出将被下一个输出覆盖,sql,oracle,plsql,Sql,Oracle,Plsql,代码的输出不应覆盖空值。 我需要在附加格式的输出(第一次输出),它是在不同的格式(第二次输出)显示。请建议我如何做到这一点 Customer_ID Event_ID Supp_CD (null) 2534660914 (null) (null) 2534660913 (null) 4000000000033919590 2534660916 (null) 7000000000491566892 2534660918

代码的输出不应覆盖空值。 我需要在附加格式的输出(第一次输出),它是在不同的格式(第二次输出)显示。请建议我如何做到这一点

Customer_ID         Event_ID   Supp_CD
(null)              2534660914  (null)
(null)              2534660913  (null)
4000000000033919590 2534660916  (null)
7000000000491566892 2534660918  (null)
7000000000888215846 2534660917  (null)
7000000000945520325 2534660912  (null)
7000000000862996964 2534660919  (null)
7000000000554412111 2534660915  (null)

我已经编写了SQL脚本,但是DBMS_输出的格式覆盖了空输出。最后一个字段SUPP_CD是文本,前两列由数字组成

SET SERVEROUTPUT ON FORMAT WRAPPED
SET VERIFY OFF
SET FEEDBACK OFF
SET TERMOUT ON

SPOOL /u01/apps/Miscellaneous/bin/spool.txt

DECLARE
  CSTID CDB_ADMIN.CPM_PREF_EVENT_STG.cdb_customer_id%TYPE;
  EVNTID CDB_ADMIN.CPM_PREF_EVENT_STG.cdb_pref_event_id%TYPE;
  SUPCD CDB_ADMIN.CPM_PREF_EVENT_STG.supp_cd%TYPE;
  COUNTS INTEGER:=0;

  cursor c1 is
    <select * from A.B>;

BEGIN
  DBMS_OUTPUT.PUT_LINE(LPAD('Customer_ID',25)||LPAD('Event_ID',25)||RPAD('Supp_ID',25));

  OPEN C1;
  LOOP
    FETCH C1 INTO CSTID,EVNTID,SUPCD;
    EXIT WHEN C1%NOTFOUND;
    DBMS_OUTPUT.put_line(LPAD(CSTID,25)||LPAD(EVNTID,25)||RPAD(SUPCD,25));
    COUNTS := COUNTS+1;
  END LOOP;
  CLOSE C1;

  DBMS_OUTPUT.PUT_LINE('');
  DBMS_OUTPUT.PUT_LINE('NUMBER OF ROWS: ' || COUNTS);
END;
/

SPOOL OFF;
输出是

              Customer_ID                 Event_ID  Supp_ID

                                        2534660914
               2534660914
                                        2534660913
               2534660913
      4000000000033919590               2534660916

      7000000000491566892               2534660918

      7000000000888215846               2534660917

      7000000000945520325               2534660912

      7000000000862996964               2534660919

      7000000000554412111               2534660915

还在想办法。请让我知道这是否可以用更好的方法来完成。

您需要替换行:
DBMS\u输出。放置行(LPAD(CSTID,25)| | LPAD(EVNTID,25)| | RPAD(SUPCD,25))如下所示,否则其他代码可以正常工作

DBMS_OUTPUT.PUT_LINE(
    CASE
        WHEN CSTID IS NULL AND EVNTID IS NULL THEN LPAD(SUPCD, 25)
        WHEN CSTID IS NULL THEN
            CASE
                WHEN SUPCD IS NULL THEN LPAD(EVNTID, 25)
                ELSE LPAD(EVNTID, 25)
                     || RPAD(SUPCD, 25)
            END
        WHEN EVNTID IS NULL THEN
            CASE
                WHEN SUPCD IS NULL THEN LPAD(CSTID, 25)
                ELSE LPAD(CSTID, 25)
                     || RPAD(SUPCD, 25)
            END
        ELSE
            CASE
                WHEN SUPCD IS NULL THEN LPAD(CSTID, 25)
                                        || LPAD(EVNTID, 25)
                ELSE LPAD(CSTID, 25)
                     || LPAD(EVNTID, 25)
                     || RPAD(SUPCD, 25)
            END
    END
);
希望这会有所帮助

DBMS_OUTPUT.PUT_LINE(RPAD('Customer_ID',20)||RPAD('Event_ID',20)||RPAD('Supp_ID',20));
DBMS_OUTPUT.PUT_LINE(
    CASE
        WHEN CSTID IS NULL AND EVNTID IS NULL THEN RPAD(SUPCD, 20)
        WHEN CSTID IS NULL THEN
            CASE
                WHEN SUPCD IS NULL THEN RPAD(EVNTID, 20)
                ELSE RPAD(EVNTID, 20)
                     || RPAD(SUPCD, 20)
            END
        WHEN EVNTID IS NULL THEN
            CASE
                WHEN SUPCD IS NULL THEN RPAD(CSTID, 20)
                ELSE RPAD(CSTID, 20)
                     || RPAD(SUPCD, 20)
            END
        ELSE
            CASE
                WHEN SUPCD IS NULL THEN RPAD(CSTID, 20)
                                        || RPAD(EVNTID, 20)
                ELSE RPAD(CSTID, 20)
                     || RPAD(EVNTID, 20)
                     || RPAD(SUPCD, 20)
            END
    END
);
END;
/
没有几个例子

干杯

------------ 更新 ------------

您可以使用以下
DBMS\u输出

DBMS_OUTPUT.PUT_LINE(
    CASE 
    WHEN CSTID IS NOT NULL THEN RPAD(CSTID, 20) 
    ELSE RPAD(' ', 20) 
    END
    ||
    CASE 
    WHEN EVNTID IS NOT NULL THEN RPAD(EVNTID, 20) 
    ELSE RPAD(' ', 20) 
    END
    ||
    CASE 
    WHEN SUPCD IS NOT NULL THEN RPAD(SUPCD, 20) 
    ELSE RPAD(' ', 20) 
    END
);


干杯

您可以使用
合并


begin
  dbms_output.put_line(LPAD('Customer_ID',25,'.')||LPAD('Event_ID',25,'.'));
  dbms_output.put_line(LPAD(coalesce(null,' '),25,'.')||LPAD('2534660914',25,'.'));
end;
/

dbms\u输出:

..............Customer_ID.................Event_ID
........................ ...............2534660914

dbfiddle

我试过了,但它仍然提供相同的输出。我们有什么办法可以通过if else解决这个问题吗?更新了答案。请检查。我在dbFiddle中检查了您的代码,在没有CSTID和SUPCD值为null的情况下,EVNTID值在Customer ID列下移动。哦,我的错!!我误解了这个要求。我已经用新的dbfiddle演示对我的答案进行了更新。请检查。我使用了coalesce,我修改的脚本以及上面部分的输出。请让我知道结果是否可以改进,您不需要使用if,您可以在一行
dbms_输出中完成
@Christie我在dbfiddle中添加了一个示例,我在dbfiddle中尝试了它,它工作正常。但在我的代码中,它抛出的错误是
ORA-06502-字符到数字的转换错误
DBMS_OUTPUT.PUT_LINE(
    CASE 
    WHEN CSTID IS NOT NULL THEN RPAD(CSTID, 20) 
    ELSE RPAD(' ', 20) 
    END
    ||
    CASE 
    WHEN EVNTID IS NOT NULL THEN RPAD(EVNTID, 20) 
    ELSE RPAD(' ', 20) 
    END
    ||
    CASE 
    WHEN SUPCD IS NOT NULL THEN RPAD(SUPCD, 20) 
    ELSE RPAD(' ', 20) 
    END
);

begin
  dbms_output.put_line(LPAD('Customer_ID',25,'.')||LPAD('Event_ID',25,'.'));
  dbms_output.put_line(LPAD(coalesce(null,' '),25,'.')||LPAD('2534660914',25,'.'));
end;
/

..............Customer_ID.................Event_ID
........................ ...............2534660914