1列を除くすべての列にnull値を持つすべての行を返すクエリを作成しようとしています。一部の行には、複数のnullエントリがどこかにあります。現時点では、すべてのエントリがnullであり、null値を持つことが許可されている唯一の列であるため、除外する列が1つあります。 WHEREにすべての列を含める方法がわからないため、立ち往生しています。
SELECT *
FROM Analytics
WHERE * IS NULL
または、1つの列に対してカウントを実行できますが、テーブルには約67列あります。
SELECT COUNT(*)
FROM Analytics
WHERE P_Id IS NULL
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で生成する必要がありません。
どのフィールドにもデータとして'x'
がないと仮定して、テストするそのようなテーブルはありません。これはSql-Server
で機能するはずです。 ( [〜#〜] demo [〜#〜] )
注: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 + ')')
使用しているRDBMSに応じて、(明示的に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('')
これがあなたが始めるのを助けることを望みます。
幸運を。