复制在SQL Server的任何列中至少具有一个空值的行

问题描述 投票:0回答:3

我有具有特定列的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”为空。

任何建议或帮助,我该如何实施。

sql sql-server tsql sql-server-2017
3个回答
2
投票

使用CASE表达式获取空列,然后进行连接。从SQL Server 2017开始,最好使用CONCAT_WShttps://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;

1
投票

更新2017版引入了concat_ws,可以显着简化代码-请查看Thorsten Kettner's answer for details。我将这个答案留在这里,希望对其他使用旧版SQL Server的读者有所帮助。

第一版一种简单的解决方案是结合使用caseconcatstuff和字符串连接运算符(+),并利用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上观看现场演示


0
投票

下面如何使用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
© www.soinside.com 2019 - 2024. All rights reserved.