Копировать строки, которые имеют по крайней мере одно нулевое значение в любом столбце на SQL Server - PullRequest
0 голосов
/ 25 марта 2020

У меня есть таблица_1 с определенными столбцами. Я хочу скопировать эти данные в table_2, который имеет по крайней мере одно нулевое значение в любом столбце table_1. Например, у table_1 есть три столбца. Теперь я хочу скопировать эти строки в таблицу table_2, которая имеет хотя бы одно нулевое значение в любом из трех столбцов таблицы table_1.

Я пробовал использовать следующий запрос:

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 is null», если в col2 отсутствует значение в этом ряду. Если более одного столбца имеют значения NULL, то следует упомянуть обо всех этих столбцах в столбце «error_value», например, «col1, col2, col3», имеет значение NULL, если во всех столбцах отсутствуют значения.

Любые предложения или помощь в том, как могу я это реализовать.

Ответы [ 4 ]

2 голосов
/ 25 марта 2020

Используйте выражения 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;
1 голос
/ 25 марта 2020

Обновление
Выпущена версия 2017 * concat_ws, которая может значительно упростить код - см. Ответ Торстена Кеттнера для деталей . Я оставляю этот ответ здесь в надежде, что он поможет другому читателю, использующему более старую версию 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

0 голосов
/ 25 марта 2020

Пробовал с простой инструкцией case и concat

INSERT INTO #table_2 (col1, col2, col3,error_value)
SELECT col1, col2, col3
,SUBSTRING(CONCAT(  CASE WHEN col1 IS NULL THEN ',col1' ELSE '' END
                    ,CASE WHEN col2 IS NULL THEN ',col2' ELSE '' END
                    ,CASE WHEN col3 IS NULL THEN ',col3' ELSE '' END
                ),2,20) + ' is null'
FROM #table_1
WHERE col1 IS NULL OR col2 IS NULL OR col3 IS NULL
0 голосов
/ 25 марта 2020

Как насчет запроса ниже с использованием 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...