SQL - 将数据移动或更新到另一个表中的第一个空列

时间:2016-01-06 10:58:29

标签: sql sql-server

我有两张包含以下数据的表格,我使用Microsoft SQL Express来管理它们:

表1

Name  Col1  ColSwitch
Row1  3     NULL
Row2  7     NULL
Row3  5     True
Row4  12    True
Row5  2     True

表2

Name  Col1  Col2  Col3
Row3  3     NULL  NULL
Row4  4     10    NULL
Row6  2     3     9
Row7  6     NULL  NULL

ColSwitch设置为True 时,我希望将行从Table1移动到Table2。 我可以通过以下方式成功完成此任务:

INSERT Table2 (Name, ColN)
    SELECT Name, Col1
    FROM Table1
    WHERE ColSwitch LIKE 'True'

但是当我需要在更新现有条目时选择第一个空列(示例中为Row3和Row4)时,我的问题就出现了。 我找到了一个使用 CASE WHEN ELSE 的例子,但我想避免在这个时候使用PHP。

简单地使用不带PHP的提供方法将填充第一列,其列名为NULL。 (下)

SELECT Name,
CASE
    WHEN Col1 IS NULL THEN 'Col1'
    WHEN Col2 IS NULL THEN 'Col2'
  ELSE 'Col3'
 END as ColN
FROM Table2

所需的输出将是Table2中的第一个NULL字段替换为Table1中的值,或者如果所有字段都已填充则添加到Col3。

输出假设 Row3 = 5 Row4 = 12 Row5 = 2 来自原始表格。

Name  Col1  Col2  Col3
Row3  3     5     NULL
Row4  4     10    12
Row5  2     NULL  NULL
Row6  2     3     9
Row7  6     NULL  NULL

这可以用简单的SQL吗?如果是,请解释如何最好地处理这个问题,并在可能的情况下提供一个例子:)

1 个答案:

答案 0 :(得分:1)

您的设计导致复杂的情况,请考虑重新分配您的解决方案。 因为你没有描述整体问题的细节,所以我无法帮助你。

解决方案1:
Genarate动态SQL并执行它。因为Column是动态的,所以每行必须生成一个INSERT。

SELECT @query='construct insert command text here' FROM Table2,Table1
EXEC sp_executesql @query

解决方案2: 如果您的列集受限,则可以使用MERGE命令。 你应该添加你的条件。

MERGE INTO Table2
USING Table1 
ON Table1.Name=Table2.Name
  WHEN MATCHED AND Table2.Col1 IS NULL
    THEN UPDATE SET Col1=Table1.Col1
  WHEN MATCHED AND Table2.Col2 IS NULL
    THEN UPDATE SET Col2=Table1.Col1
  WHEN NOT MATCHED BY SOURCE
    THEN INSERT (Name,Col1) VALUES Table1.Name, Table1.Col1