การกำหนดพารามิเตอร์ให้กับ oracle sql

ฉันใช้ Oracle - นักพัฒนา SQL

ต้องการตรวจสอบจำนวนค่าว่างสำหรับแต่ละคอลัมน์

ขณะนี้ฉันกำลังใช้ด้านล่างเพื่อให้ได้ผลลัพธ์

เลือก COLUMN_NAME จาก all_tab_columns โดยที่ table_name = 'EMPLOYEE'

    SELECT COUNT (*) FROM EMPLOYEE WHERE <Column_name1> IS NULL
    UNION ALL
    SELECT COUNT (*) FROM EMPLOYEE WHERE <Column_name2> NULL
    UNION ALL
    SELECT COUNT (*) FROM EMPLOYEE WHERE <Column_name3> IS NULL
    UNION ALL ......................

เราจะใช้ค่าผูกเพื่อเรียกใช้แบบสอบถามด้านล่างได้อย่างไร

   DEFINE Column_name = Column_name1
   SELECT COUNT (*) FROM EMPLOYEE WHERE &&Column_name IS NULL .

person Awknewbie    schedule 27.08.2014    source แหล่งที่มา
comment
คุณต้องใช้วิธีไดนามิก sql เพื่อสิ่งนั้น   -  person Sathyajith Bhat    schedule 27.08.2014
comment
NUM_NULLS ใน all_tab_columns จะมีจำนวน NULL ค่าในตารางนี้ โดยตารางมีการอัพเดทสถิติ!! การแทรก/อัปเดตข้อมูลใดๆ โดยไม่รวบรวมสถิติจะส่งผลให้ได้รับคำตอบที่ผิด หากต้องการทราบเกี่ยวกับสถิติ คุณสามารถอ้างอิงถึง Oracle Docs   -  person Maheswaran Ravisankar    schedule 27.08.2014


คำตอบ (3)


คุณไม่สามารถใช้ตัวแปรการผูกเมื่อคุณสร้างคำสั่ง select คุณสามารถส่งผ่านค่าผ่านตัวแปรการผูกได้ แต่ตัวคำสั่ง select นั้นไม่สามารถสร้างได้ คุณต้อง วิธี SQL แบบไดนามิก โดยใช้ EXECUTE IMMEDIATE< /ก>.

นี่คือตัวอย่าง:

DECLARE
    v_sql_statement VARCHAR2(2000);
    n_null_count    NUMBER;
BEGIN
    FOR cn IN (SELECT column_name
               FROM   user_tab_cols
               WHERE  table_name = 'EMPLOYEE') LOOP
        v_sql_statement := 'SELECT COUNT(1) FROM EMPLOYEE where '
                           || cn.column_name
                           || ' IS null';

        EXECUTE IMMEDIATE v_sql_statement INTO n_null_count;

        dbms_output.Put_line('Count of nulls for column: '
                             || cn.column_name
                             || ' is: '
                             || n_null_count);
    END LOOP;
END; 

นี่คือสิ่งที่แบบสอบถามข้างต้นจะดึงข้อมูล

จำนวนค่าว่างสำหรับคอลัมน์: EMPNO คือ: 0
จำนวนค่าว่างสำหรับคอลัมน์: NAME คือ: 0
จำนวนค่าว่างสำหรับคอลัมน์: JOB คือ: 0
จำนวนค่าว่างสำหรับคอลัมน์: BOSS คือ: 1< br> จำนวนค่าว่างสำหรับคอลัมน์: HIREDATE คือ: 0
จำนวนค่าว่างสำหรับคอลัมน์: SALARY คือ: 0
จำนวนค่าว่างสำหรับคอลัมน์: COMM คือ: 20
จำนวนค่าว่างสำหรับคอลัมน์: DEPTNO คือ: 0

person Sathyajith Bhat    schedule 27.08.2014
comment
ทำไมไม่ใช้ EXECUTE IMMEDIATE เดียวที่ใช้ all_tab_columns COUNT(COLUMN_NAME1),COUNT(COLUMN_NAME2) FROM TABLE? - person Maheswaran Ravisankar; 27.08.2014
comment
@MaheswaranRavisankar COLUMN_NAME1, COLUMN_NAME2... COLUMN_NAMEn คือแถวใน all_tab_columns คุณต้องวนซ้ำทุกแถวและค้นหาว่าไม่มีค่าว่างสำหรับแต่ละ column_name - person Sathyajith Bhat; 27.08.2014
comment
ขอขอบคุณ คุณสัตยา ที่ช่วยชี้แนะครับ - person Awknewbie; 27.08.2014

ไม่ คุณไม่สามารถทำสิ่งนี้กับตัวแปรการผูกได้ เนื่องจากแบบสอบถามเป็นไปตามและต้องทราบชื่อฟิลด์ ณ เวลาที่คอมไพล์ เพื่อให้บรรลุสิ่งที่คุณต้องการ คุณสามารถสร้างแบบสอบถามที่คุณต้องการใน VARCHAR2 และใช้ดำเนินการได้ทันที

person Robert3452    schedule 27.08.2014

ทำไมไม่ใช้เพียง NUM_NULLS? แต่คุณควรรวบรวมสถิติไว้ก่อน

exec dbms_stats.gather_table_stats('user','TBL');

select num_nulls from user_tab_columns where table_name='TBL';

คุณยังสามารถใช้ coalesce เพื่อการดำเนินการที่เร็วกว่า IS NULL

SELECT COUNT(COALESCE( _COLUMN, 1)) AS CNT FROM _TABLE;

หากคุณต้องการให้นับคอลัมน์อย่างชาญฉลาด ฉันจะให้คำตอบของ Sathya เป็นรอง แต่ใช้ COALESCE แทนที่จะเป็น IS NULL

person SriniV    schedule 27.08.2014