我有一个场景,我有一个输入表表(动态表的列数不固定),如下所示,需要根据非空值获取多个表
输入表
ID Name Mobile Year value
1 john 1238769 2001 35
2 tommy 3423456 2001 56
3 smith 8761934 2007 65
4 NULL 4783921 2005 78
5 robert 8549543 2008 18
6 mary 5648404 2011 40
7 NULL 6729113 2003 59
8 NULL NULL 2006 10
9 cathy NULL 2010 35
10 jessi NULL 2012 45
所以我需要基于not null
的下表输出表1
ID Name Mobile Year value
1 john 1238769 2001 35
2 tommy 3423456 2001 56
3 smith 8761934 2007 65
5 robert 8549543 2008 18
6 mary 5648404 2011 40
输出表2
ID Mobile Year value
4 4783921 2005 78
7 6729113 2003 59
输出表3
ID Name Year value
9 cathy 2010 3578
10 jessi 2012 45
最后输出表4
ID Year value
8 2006 10
答案 0 :(得分:0)
INSERT INTO OutputTable1
SELECT yourtable.*
FROM yourtable
WHERE Name IS NOT NULL and Mobile IS NOT NULL
INSERT INTO OutputTable2
SELECT yourtable.*
FROM yourtable
WHERE Name IS NULL and Mobile IS NOT NULL
INSERT INTO OutputTable3
SELECT yourtable.*
FROM yourtable
WHERE Name IS NOT NULL and Mobile IS NULL
INSERT INTO OutputTable4
SELECT yourtable.*
FROM yourtable
WHERE Name IS NULL and Mobile IS NULL
答案 1 :(得分:0)
由于列数未知(可能是它们的名称),因此您必须使用动态SQL。假设输入表具有PK并且PK的名称是事先已知的或者可以以某种方式容易地确定,这是解决问题的一种方法:
查询元数据以确定表的列名。
使用名称列表,构建并执行一个查询:
取消显示所有数据(非PK)列(显然将它们全部转换为字符串);
将PK的不可分割结果集和GROUP_CONCAT
名称分组为两个列表:
1)具有非空值的列,格式为'name1,name2,...'
,SelectList
,
2)具有空值的列,如下:'name1 IS NULL AND name2 IS NULL AND ...'
,NullCondition
;
使用上一个结果集和以下模板中的不同SelectList
和NullCondition
值,构建一系列查询以从原始表中检索数据:
' SELECT ' + SelectList +
' FROM yourtable' +
' WHERE ' + NullCondition
我不确定这两种产品(SQL Server或MySQL)中哪一种更方便实现上述功能。确实,SQL Server没有像MySQL GROUP_CONCAT
这样的专用聚合连接函数。但是,解决方法是not unknown。另一方面,MySQL不支持SQL Server具有的这个非常方便的UNPIVOT
子句。但同样,使用UNPIVOT
exist as well的替代方法。