web-dev-qa-db-ja.com

任意の列にヌル値を持つすべての行を検索

1列を除くすべての列にnull値を持つすべての行を返すクエリを作成しようとしています。一部の行には、複数のnullエントリがどこかにあります。現時点では、すべてのエントリがnullであり、null値を持つことが許可されている唯一の列であるため、除外する列が1つあります。 WHEREにすべての列を含める方法がわからないため、立ち往生しています。

SELECT *
FROM Analytics
WHERE * IS NULL

または、1つの列に対してカウントを実行できますが、テーブルには約67列あります。

SELECT COUNT(*)
FROM Analytics
WHERE P_Id IS NULL
16
Snake_Plissken

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で生成する必要がありません。

12
Martin Smith

どのフィールドにもデータとして'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 + ')')
1
Kaf

使用している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('')

これがあなたが始めるのを助けることを望みます。

幸運を。

0
sgeddes