Найти все строки с нулевыми значениями в любом столбце
Я пытаюсь создать запрос, который возвращает все строки, которые имеют значение 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
вероятно, построение запроса с 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 + ')')