SQL количество пустых ячеек - PullRequest
1 голос
/ 22 апреля 2010

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

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

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

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

Заранее спасибо !!!

Сен

1 Ответ

0 голосов
/ 22 марта 2011

Я искал то же самое и не думаю, что это возможно.

Кажется, единственное достойное решение - назвать их от 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)
...