根据sqlserver / ssis中的非空条件将表拆分为多个表

时间:2013-04-09 16:24:35

标签: mysql sql sql-server sql-server-2008 ssis

我有一个场景,我有一个输入表表(动态表的列数不固定),如下所示,需要根据非空值获取多个表

输入表

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

2 个答案:

答案 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的名称是事先已知的或者可以以某种方式容易地确定,这是解决问题的一种方法:

  1. 查询元数据以确定表的列名。

  2. 使用名称列表,构建并执行一个查询:

    • 取消显示所有数据(非PK)列(显然将它们全部转换为字符串);

    • 将PK的不可分割结果集和GROUP_CONCAT名称分组为两个列表:

      1)具有非空值的列,格式为'name1,name2,...'SelectList

      2)具有空值的列,如下:'name1 IS NULL AND name2 IS NULL AND ...'NullCondition;

  3. 使用上一个结果集和以下模板中的不同SelectListNullCondition值,构建一系列查询以从原始表中检索数据:

    ' SELECT ' + SelectList +
    ' FROM yourtable' +
    ' WHERE ' + NullCondition
    
  4. 我不确定这两种产品(SQL Server或MySQL)中哪一种更方便实现上述功能。确实,SQL Server没有像MySQL GROUP_CONCAT这样的专用聚合连接函数。但是,解决方法是not unknown。另一方面,MySQL不支持SQL Server具有的这个非常方便的UNPIVOT子句。但同样,使用UNPIVOT exist as well的替代方法。