2017-05-08 3 views
1

データベース:大部分の列がヌルの行を検索しますか?

私は2つのテーブルを持っています。 Table1には50個のフィールドがあり、これらのうち25個はすべてSomeValue1,SomeValue2 ... SomeValue25のようになります。 Table2は、SomeOtherValue1からSomeOtherValue30までの範囲を除き、同様です。

1)これらの両方の表では、これらの「番号付き」列はnullです。

2)これらの両方の表の場合、これらの「番号付き」列は、前の列がすべてnullでない場合にのみ値を許可する必要があります。したがって、SomeValue1SomeValue2の両方がnullでない場合は、SomeValue3に値を入力する必要があります。

問題:

私は与えられたレコードがnullではありません以上のnのフィールドを持つ両方のテーブルからすべてのレコードを検索しようとしています。

残念ながら、私はデータの完全性を信頼できません。 SELECT * FROM Table WHERE SomeValueN IS NOT NULLを実行することはできません。上記のルール2が適用されたことを保証できないためです。

質問:

は、私は手動ですべての列の名前を入力しなくても、SELECT MyPrimaryKey FROM Table WHERE COUNT([all_columns with null values]) > nような何かを行うことができます方法はありますか?

+0

あなたがそれらを入力する必要はありませんので、あなたはすべての列を結合するシステムテーブルの上にlist_Aggを使用することができます:Pまたあなたすべての列 xQbert

+0

または 'SELECT * FROMテーブルWHERE SomeValueN IS NOT NULL'を' concat(somevalue1、somevalue2、somevalue3 ...)がnullでない ' – xQbert

答えて

0

cross apply(values())と骨材を使用した動的アンピボットとhaving count()...

テストセットアップSomeValueで始まり25のNULL可能列を持つテーブルであり、次のとおり

create table t (id int not null identity(1,1) , SomeValue1 int null , SomeValue2 int null , SomeValue3 int null , SomeValue4 int null , SomeValue5 int null , SomeValue6 int null , SomeValue7 int null , SomeValue8 int null , SomeValue9 int null , SomeValue10 int null , SomeValue11 int null , SomeValue12 int null , SomeValue13 int null , SomeValue14 int null , SomeValue15 int null , SomeValue16 int null , SomeValue17 int null , SomeValue18 int null , SomeValue19 int null , SomeValue20 int null , SomeValue21 int null , SomeValue22 int null , SomeValue23 int null , SomeValue24 int null , SomeValue25 int null) 
insert into t values 
(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
,(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, null) 
,(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, null, null) 
,(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, null, null, null) 
,(5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, null, null, null, null) 
,(6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, null, null, null, null, null) 
,(7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, null, null, null, null, null, null) 
,(8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, null, null, null, null, null, null, null) 
,(9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, null, null, null, null, null, null, null, null) 
,(10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, null, null, null, null, null, null, null, null, null) 
,(11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, null, null, null, null, null, null, null, null, null, null) 
,(12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, null, null, null, null, null, null, null, null, null, null, null) 
,(13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, null, null, null, null, null, null, null, null, null, null, null, null) 
,(14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, null, null, null, null, null, null, null, null, null, null, null, null, null) 
,(15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, null, null, null, null, null, null, null, null, null, null, null, null, null, null) 
,(16, 16, 16, 16, 16, 16, 16, 16, 16, 16, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null) 
,(17, 17, 17, 17, 17, 17, 17, 17, 17, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null) 
,(18, 18, 18, 18, 18, 18, 18, 18, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null) 
,(19, 19, 19, 19, 19, 19, 19, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null) 
,(20, 20, 20, 20, 20, 20, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null) 
,(21, 21, 21, 21, 21, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null) 
,(22, 22, 22, 22, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null) 
,(23, 23, 23, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null) 
,(24, 24, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null) 
,(25, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null) 

クエリ:

declare @cols as nvarchar(max); 
declare @sql as nvarchar(max); 

set @cols = stuff((
    select ',(''' + C.name + ''','+ quotename(C.name) +')' 
    from sys.columns c 
    where c.object_id = object_id('dbo.t') /* <-- table name */ 
    and c.name like 'SomeValue%' /* <-- column name starts with */ 
    order by c.column_id 
    for xml path (''), type).value('.','nvarchar(max)') 
    ,1,1,''); 

set @sql = ' 
select t.id --, u.column_name, u.column_value 
from t 
cross apply (
    values '[email protected]+') u (column_name,column_value) 
group by t.id 
having count(u.column_value) > 10;' /* <-- how many not null */ 

select @sql as CodeGenerated; 
exec sp_executesql @sql; 

rextesterデモ:http://rextester.com/UKFM26061

生成されるコード:

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--+ 
|                                                                                                CodeGenerated                                                                                                | | 
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--+ 
|                                                                                                                                                                                                  | | 
|  select t.id --, u.column_name, u.column_value                                                                                                                                                                                      | | 
|  from t                                                                                                                                                                                                | | 
|  cross apply (                                                                                                                                                                                              | | 
|  values ('SomeValue1',[SomeValue1]),('SomeValue2',[SomeValue2]),('SomeValue3',[SomeValue3]),('SomeValue4',[SomeValue4]),('SomeValue5',[SomeValue5]),('SomeValue6',[SomeValue6]),('SomeValue7',[SomeValue7]),('SomeValue8',[SomeValue8]),('SomeValue9',[SomeValue9]),('SomeValue10',[SomeValue10]),('SomeValue11',[SomeValue11]),('SomeValue12',[SomeValue12]),('SomeValue13',[SomeValue13]),('SomeValue14',[SomeValue14]),('SomeValue15',[SomeValue15]),('SomeValue16',[SomeValue16]),('SomeValue17',[SomeValue17]),('SomeValue18',[SomeValue18]),('SomeValue19',[SomeValue19]),('SomeValue20',[SomeValue20]),('SomeValue21',[SomeValue21]),('SomeValue22',[SomeValue22]),('SomeValue23',[SomeValue23]),('SomeValue24',[SomeValue24]),('SomeValue25',[SomeValue25])) u (column_name,column_value) | | 
|  group by t.id                                                                                                                                                                                              | | 
|  having count(u.column_value) > 10;                                                                                                                                                                                         | | 
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--+ 

問合せ実行リターン:

+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
| 10 | 
| 11 | 
| 12 | 
| 13 | 
| 14 | 
| 15 | 
+----+ 
関連する問題