Найти все строки с нулевыми значениями в любом столбце

Я пытаюсь создать запрос, который возвращает все строки, которые имеют значение null во всех, кроме 1 столбца. Некоторые строки будут иметь более одной записи null где-то. Есть один столбец, который я хочу исключить, потому что в данный момент все записи имеют значение null, и это единственный столбец, которому разрешено иметь значения null. Я застрял, потому что не знаю, как включить все столбцы в WHERE.

SELECT *
FROM Analytics
WHERE * IS NULL

альтернативно, я могу сделать подсчет для одного столбца, но в таблице около 67 столбцов.

SELECT COUNT(*)
FROM Analytics
WHERE P_Id IS NULL

3 ответов


в SQL Server вы можете позаимствовать идею из ответ

;WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' as ns)
SELECT *
FROM   Analytics
WHERE  (SELECT Analytics.*
        FOR xml path('row'), elements xsinil, type
        ).value('count(//*[local-name() != "colToIgnore"]/@ns:nil)', 'int') > 0

SQL Fiddle

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


в зависимости от того, какие СУБД вы используете, я думаю, ваш единственный вариант (а не прямо говорили,WHERE col1 IS NULL and col2 IS NULL and col3 IS NULL ...) было бы использовать динамический SQL.

например, если вы хотите получить все имена столбцов из базы данных SQL Server, вы могли бы использовать что-то вроде этого, чтобы вернуть эти имена:

SELECT
     name
FROM
     sys.columns
WHERE
     object_id = OBJECT_ID('DB.Schema.Table')

вы можете использовать for XML для создания предложения WHERE:

SELECT Name + ' IS NULL AND ' AS [text()]
FROM sys.columns c1
WHERE     object_id = OBJECT_ID('DB.Schema.Table')
ORDER BY Name
FOR XML PATH('')

надеюсь, это поможет вам начать.

удачи.


у меня нет такой таблицы для тестирования, предполагая, что нет 'x' как данные в любом поле, я думаю, что это должно работать на Sql-Server; (демо)

Примечание: я отфильтровал keyColumn как c.name != 'keyColumn'

DECLARE @S NVARCHAR(max), @Columns VARCHAR(50), @Table VARCHAR(50)

SELECT @Columns = '66', --Number of cols without keyColumn
       @Table = 'myTable'

SELECT @S =  ISNULL(@S+'+ ','') + 'isnull(convert(nvarchar, ' + c.name + '),''x'')'  
FROM sys.all_columns c 
WHERE c.object_id = OBJECT_ID(@Table) AND c.name != 'keyColumn'

exec('select * from '+@Table+' where ' + @S + '= replicate(''x'',' + @Columns + ')')