我有两张包含以下数据的表格,我使用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吗?如果是,请解释如何最好地处理这个问题,并在可能的情况下提供一个例子:)
答案 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