1

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

输入表

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

所以我需要一些基于非空的下表

输出表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
4

2 回答 2

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
于 2013-04-09T16:39:33.233 回答
0

由于列数未知(可能还有它们的名称),您将不得不使用动态 SQL。假设输入表有一个 PK 并且 PK 的名称是事先知道的,或者可以很容易地确定,这是解决问题的一种方法:

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

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

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

    • 将 PK 的未透视结果集和GROUP_CONCAT名称分组到两个列表中:

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

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

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

    ' SELECT ' + SelectList +
    ' FROM yourtable' +
    ' WHERE ' + NullCondition
    

我不确定在这两种产品中的哪一种(SQL Server 或 MySQL)中实现上述功能会更方便。确实,SQL Server 没有像 MySQL 那样的专用聚合连接函数GROUP_CONCAT。不过,解决方法并非未知。另一方面,MySQL 不支持UNPIVOTSQL Server 拥有的这个非常方便的子句。但同样,也UNPIVOT 存在使用的替代方案。

于 2013-04-11T08:58:16.793 回答