2010-04-22 6 views
1

У меня есть следующая проблема. У меня есть таблица в db, со многими столбцами. Я могу сделать различные виды запросов на выборку, чтобы показать, например, для каждой записи, которая удовлетворяет условие:SQL count NULL cell

  • всех ячейки из столбцов с именами, заканчивающихся в _t0
  • все клетки из столбцов с именами, заканчивающимися в _t1
  • ...

чтобы получить список столбцов для формирования запросов, которые я использую в информационной схему.

Проблема: каждый запрос возвращает запись с подмножеством столбцов большой таблицы. Это означает, что я могу получить ряд (всех!) NULL. Как я могу попросить мой запрос отклонить такие строки, не вводя явно имена столбцов (т. Е. Говоря, где col_1 не является нулевым, col_2 не является нулевым ...)? Является ли это возможным?

Заранее благодарен!

сентября

+1

Какой операционной системы вы пользуетесь? MySQL, SQL Server, Oracle? –

+0

У вас есть основной ключ на этом столе? –

+1

[Общее наблюдение] Таблицы с кучами колонн поднимают тревожные звонки для меня. –

ответ

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)