根据条件将行插入 table

insert rows into table based on criteria

假设我有 5 列,其中包含值“A”或“B”

+------+------+------+------+------+
| Col1 | Col2 | Col3 | Col4 | Col5 |
+------+------+------+------+------+
| A    | A    | B    | A    | B    |
| B    | A    | B    | B    | A    |
+------+------+------+------+------+

我还想为这 5 列分配 ID 号 1 到 5

+----+---------+
| ID | Columns |
+----+---------+
|  1 | Col1    |
|  2 | Col2    |
|  3 | Col3    |
|  4 | Col4    |
|  5 | Col5    |
+----+---------+

如果第一行中的 col1、col2、col4 包含一个 'A',我想在数据库中插入一个新行 table,在这种情况下,有 3 个新行将插入每个包含其各自的 ID 号。

我要插入的 table 应该看起来像这样

 +----+----------+----------+----------+----------+
    | ID | SomeCol0 | SomeCol1 | SomeCol2 | SomeCol3 |
    +----+----------+----------+----------+----------+
    |  1 | x        | x        | x        | x        |
    |  2 | x        | x        | x        | x        |
    |  4 | x        | x        | x        | x        |
    +----+----------+----------+----------+----------+

这是针对 VB.NET 应用程序的。我更愿意在 TSQL 中解决这个逻辑,但 VB 代码也可以。我真的不知道该怎么办。非常感谢任何帮助。

假设我们有以下数据:

DECLARE @DataSource TABLE
(
    [Col1] CHAR(1)
   ,[Col2] CHAR(1)
   ,[Col3] CHAR(1)
   ,[Col4] CHAR(1)
   ,[Col5] CHAR(1)
);

INSERT INTO @DataSource ([Col1], [Col2], [Col3], [Col4], [Col5])
VALUES ('A', 'A', 'B', 'A', 'B')  -- this should be inserted
      ,('B', 'A', 'B', 'B', 'B')
      ,('A', 'A', 'A', 'A', 'B')  -- this should be inserted
      ,('B', 'B', 'B', 'A', 'B');

首先,我们需要根据您的条件筛选行:

SELECT *
FROM @DataSource
WHERE [Col1] = 'A' AND [Col2] = 'A' AND [Col4] = 'A';

现在,我们需要 UNPIVOT 上面的结果,以便为每一列分配一个 ID 值:

SELECT [ID]
      ,[Value]
FROM
(
    SELECT [Col1] AS [1]
          ,[Col2] AS [2]
          ,[Col3] AS [3]
          ,[Col4] AS [4]
          ,[Col5] AS [5]
    FROM @DataSource
    WHERE [Col1] = 'A' AND [Col2] = 'A' AND [Col4] = 'A' 
) DS
UNPIVOT
(
    [Value] FOR [ID] IN ([1], [2], [3], [4], [5])
) UNPVT;

最后,只需使用 WHERE 子句过滤 ID:

SELECT [ID]
      ,[Value]
FROM
(
    SELECT [Col1] AS [1]
          ,[Col2] AS [2]
          ,[Col3] AS [3]
          ,[Col4] AS [4]
          ,[Col5] AS [5]
    FROM @DataSource
    WHERE [Col1] = 'A' AND [Col2] = 'A' AND [Col4] = 'A' 
) DS
UNPIVOT
(
    [Value] FOR [ID] IN ([1], [2], [3], [4], [5])
) UNPVT
WHERE [ID] IN (1, 2, 4);