我正在使用Oracle - SQL开发人员
想要检查每列的空值计数。
目前我正在使用以下方法取得成果。
从all_tab_columns中选择COLUMN_NAME,其中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 .
答案 0 :(得分:1)
在构造select语句时不能使用绑定变量,可以通过绑定变量传递值,但不能构造select语句本身。你必须去the dynamic SQL way, using 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
列的空值计数:HIREDATE为:0
列的空值计数:SALARY为:0
列的空值计数:COMM为:20
列的空值计数:DEPTNO为:0
答案 1 :(得分:0)
不,你不能用绑定变量做到这一点。 这是因为查询已得到编译,并且必须在编译时知道字段名称。 要实现您的目标,您可以在VARCHAR2中构建所需的查询并使用execute immediate。
答案 2 :(得分:0)
为什么不简单地使用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;
如果你想有列明智的计数,那么我会用S COALESCE
而不是IS NULL
来回答Sathya的回答