我有具有特定列的table_1。我想将该数据复制到table_1的任何一列中至少有一个空值的table_2。例如table_1具有三列。现在,我想将这些行复制到table_1的三列中至少有一个空值的table_2。
我使用以下查询尝试了它:
insert into table_2 (col1, col2, col3)
select col1, col2, col3
from table_1
where col1 is null or col2 is null or col3 is null
但是,存在一个问题,即table_2的列'error_value'应该包含指示哪个列具有与该特定行相对应的NULL值的数据就像它应该提到的那样,如果col2为col2为null在该行中缺少值。如果不止一个列具有NULL值,那么如果所有列均具有缺失值,则应提及“ error_value”列中的所有那些列,例如“ col1,col2,col3”为空。
任何建议或帮助,我该如何实施。
使用CASE
表达式获取空列,然后进行连接。从SQL Server 2017开始,最好使用CONCAT_WS
(https://docs.microsoft.com/de-de/sql/t-sql/functions/concat-ws-transact-sql?view=sql-server-ver15)来实现。
insert into table_2 (col1, col2, col3, error_value)
select
col1, col2, col3,
concat_ws(', ',
case when col1 is null then 'col1' end,
case when col2 is null then 'col2' end,
case when col3 is null then 'col3' end
) + ' is null'
from table_1
where col1 is null or col2 is null or col3 is null;
更新2017版引入了concat_ws
,可以显着简化代码-请查看Thorsten Kettner's answer for details。我将这个答案留在这里,希望对其他使用旧版SQL Server的读者有所帮助。
第一版一种简单的解决方案是结合使用case
,concat
,stuff
和字符串连接运算符(+
),并利用concat
会将null
隐式转换为空的事实。字符串,而+
则不会。
首先,创建并填充示例表(请在您将来的问题中为我们保存此步骤):
create table table_1 (col1 int, col2 int, col3 int);
create table table_2 (col1 int, col2 int, col3 int, error_value varchar(100));
insert into table_1(col1, col2, col3) VALUES
(null, null, null),
(null, null, 1),
(null, 1, null),
(null, 1, 1),
(1, null, null),
(1, null, 1),
(1, 1, null),
(1, 1, 1);
然后,insert...select
语句:
insert into table_2 (col1, col2, col3, error_value)
select
col1, col2, col3, stuff(
concat(
',' + case when col1 is null then 'col1' end, -- will be null if col1 contains a value
',' + case when col2 is null then 'col2' end, -- will be null if col2 contains a value
',' + case when col3 is null then 'col3' end, -- will be null if col3 contains a value
' is null'), 1, 1, '')
from table_1
where col1 is null or col2 is null or col3 is null
[在rextester上观看现场演示
下面如何使用CONCAT和IIF查询:
insert into
table_2 (col1, col2, col3, col4)
select
col1,
col2,
col3,
CONCAT(
IIF(col1 is null, 'col1 ', ''),
IIF(col2 is null, 'col2 ', ''),
IIF(col3 is null, 'col3 ', ''),
' is null'
)
from
table_1
where
col1 is null
or col2 is null
or col3 is null