[这在iSeries / DB2数据库中,如果这有任何区别]
我想编写一个过程来识别留空或为零的列(给定一个表列表)。
假设我可以从中央系统表中提取表和列定义,我该如何检查上述条件?我的第一个猜测是每列生成一个动态语句,如:
select count(*) from my_table where my_column != 0
并检查这是否返回零行,但有更好/更快/标准的方法吗?
NB这只需要处理简单的字符,整数/小数字段,没什么特别的!
答案 0 :(得分:3)
是的,通常,我会在SQL Server中执行类似的操作:
SELECT
REPLACE(REPLACE(REPLACE(
'
SELECT COUNT(*) AS [COUNT NON-EMPTY IN {TABLE_NAME}.{COLUMN_NAME}]
FROM [{TABLE_SCHEMA}].[{TABLE_NAME}]
WHERE [{COLUMN_NAME}] IS NOT NULL
OR [{COLUMN_NAME}] <> 0
'
, '{TABLE_SCHEMA}', c.TABLE_SCHEMA)
, '{TABLE_NAME}', c.TABLE_NAME)
, '{COLUMN_NAME}', c.COLUMN_NAME) AS [SQL]
FROM INFORMATION_SCHEMA.COLUMNS c
INNER JOIN INFORMATION_SCHEMA.TABLES t
ON t.TABLE_TYPE = 'BASE TABLE'
AND c.TABLE_CATALOG = t.TABLE_CATALOG
AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
AND c.TABLE_NAME = t.TABLE_NAME
AND c.DATA_TYPE = 'int'
通过执行整个查询的UNION并检查每列上的IS_NULLABLE,您可以获得更多的动力,显然您可能对不同的数据类型有不同的要求,并且跳过标识列等。
答案 1 :(得分:3)
检查DB2上仅包含NULL的列:
select t.tabschema, t.tabname, c.colname
from sysstat.tables t, sysstat.columns c
where ((t.tabschema = 'MYSCHEMA1' and t.tabname='MYTABLE1') or
(t.tabschema = 'MYSCHEMA2' and t.tabname='MYTABLE2') or
(...)) and
t.tabschema = c.tabschema and t.tabname = c.tabname and
t.card = c.numnulls
有关系统统计信息的详情,例如在这里:http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0001070.htm和http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0001073.htm
同样,您可以使用SYSSTAT.COLUMNS.AVGCOLLEN检查空列(只是它似乎不适用于LOB)。
编辑:并且,要检查仅包含零的列,请尝试在SYSSTAT.COLUMNS中比较HIGH2KEY和LOW2KEY。
答案 2 :(得分:0)
我假设你想要知道给定列的所有行中是否有任何值。如果你的列可能有“空白”,你可能需要在WHERE子句中添加一个OR NOT NULL来获得正确的答案。