SQL计数NULL单元格

时间:2010-04-22 07:59:55

标签: sql null database

我有以下问题。我在数据库中有一个表,有很多列。我可以执行不同类型的选择查询,例如,显示满足条件的每条记录:

  • 名称以_t0
  • 结尾的列中的所有单元格
  • 名称以_t1
  • 结尾的列中的所有单元格
  • ...

要获取列列表以形成查询,我使用信息架构。

现在,问题是:每个查询都返回一个包含大表列的子集的记录。这意味着我可以获得一行(所有!)NULL。如何让我的查询拒绝这些行而不必明确键入列名(即通过说col_1不为空,col_2不为空...)?有可能吗?

提前致谢!!!

1 个答案:

答案 0 :(得分:0)

我一直在寻找同样的东西,我认为这不可能。

唯一合适的解决方案似乎是从Bytes.com

命名
SELECT
CASE WHEN patientid IS NULL THEN 1 ELSE 0 END+
CASE WHEN age IS NULL THEN 1 ELSE 0 END+
CASE WHEN weight IS NULL THEN 1 ELSE 0 END+
CASE WHEN height IS NULL THEN 1 ELSE 0 END+
CASE WHEN race IS NULL THEN 1 ELSE 0 END
FROM tblPatientDemographics

当然这没什么好玩的,所以我写了一些动态SQL来为我做这个。很优雅,但我不确定有更好的方法。

DECLARE @tableName SYSNAME
DECLARE @sql VARCHAR(MAX)
DECLARE @sqltail VARCHAR(MAX)
-- loop through all the fields in a table.
DECLARE @colName SYSNAME
SET @tableName = 'YourTableName'
DECLARE crsCol CURSOR FORWARD_ONLY READ_ONLY
FOR
    SELECT  name
    FROM    syscolumns
    WHERE   id = OBJECT_ID(@tableName)
    ORDER BY colid
OPEN crsCol
SET @sql = ''
SET @sqltail = 'FROM [' + @tableName + ']'
FETCH NEXT FROM crsCol INTO @colName
WHILE @@FETCH_STATUS = 0 
    BEGIN
        IF @sql = ''
            SET @sql = 'SELECT /* Add Your PK Fields here, */ NullCount = '
        ELSE 
            SET @sql = @sql + '+ '

        SET @sql = @sql + 'CASE WHEN [' + @colName + '] IS NULL THEN 1 ELSE 0 END '

        FETCH NEXT FROM crsCol INTO @colName
    END
CLOSE crsCol
DEALLOCATE crsCol
PRINT (@sql + @sqltail)
EXEC(@sql + @sqltail)