【问题标题】:Insert 2 rows when a condition verified验证条件后插入 2 行
【发布时间】:2019-08-27 09:55:32
【问题描述】:

我有一个 SELECT INTO #tTable SELECT CASE WHEN 条件 THEN value1 ELSE value2 查询。 验证特定条件后,我必须插入 #tTable 2 行而不是 1 行,它们仅在 1 列中彼此不同。

我是这样解决这个问题的:

  1. 在 #tTable 中插入一个 foo 行,其中包含我的列 v1v2 的值

  2. 插入#tTable value1 where col = v1v2

  3. 插入#tTable value2 where col = v1v2

  4. 从 #tTable 中删除,其中 col = v1v2

有没有更好、性能更高的方法来做到这一点?有没有办法在 INSERT INTO #table SELECT CASE WHEN 语句中插入 2 行?

例子:

INSERT INTO #tTable (col1, col2, col3)

SELECT T.col1, T.col2, CASE WHEN T.col1 > T.col2 THEN v1v2

WHEN T.col1 = T.col2 THEN value1 ELSE value2 END

FROM Table1 as T;

INSERT INTO #tTable (col1, col2, col3)

SELECT T.col1, T.col2, value1

FROM Table1 as T

WHERE T.col3 = v1v2;

INSERT INTO #tTable (col1, col2, col3)

SELECT T.col1, T.col2, value2

FROM Table1 as T

WHERE T.col3 = v1v2;

DELETE FROM #tTable

WHERE col3 = v1v2;

当 T.col1 > T.col2 时,我必须插入 2 行(一行带有 value1,另一行带有 value2)

编辑:

其实我的查询是这样的:

INSERT INTO #tTable (col1, col2, col3)

SELECT T.col1, T.col2,

CASE WHEN condition1 AND condition2 AND condition3 THEN value1

WHEN condition4 AND condition5 AND condition6 THEN value2

WHEN condition7 AND condition8 AND condition9 THEN v1v2 END

FROM Table1 as T

【问题讨论】:

  • 样本数据和预期结果将帮助我们在这里为您提供帮助。第一条语句不是有效的 SQL,因此显示您的实际尝试也会很有用。
  • 请阅读tsql tag infoedit你的问题的前三段。
  • 也发布您的查询。
  • 我无法发布我的真实查询,但这是我的问题(已编辑问题)

标签: sql-server sql-insert


【解决方案1】:

您不能使用CASE 生成另一行,您必须使用UNION ALL 或额外的INSERT。我看到的最简单的方法是使用UNION ALL,在每个SELECT 上重复v1 + v2 的条件:

INSERT INTO #tTable (
    col1, 
    col2, 
    col3)
SELECT
    V.Col1,
    V.Col2,
    col3 = V.value1
FROM
    Table1 AS V
WHERE
    (condition1 AND condition2 AND condition3) OR -- value1 condition
    (condition7 AND condition8 AND condition9) -- shared condition

UNION ALL

SELECT
    V.Col1,
    V.Col2,
    col3 = V.value2
FROM
    Table1 AS V
WHERE
    (condition4 AND condition5 AND condition6) OR -- value2 condition
    (condition7 AND condition8 AND condition9) -- shared condition

如果您的条件必然会发生变化或很复杂,则只需将它们放在 CTE 上并引用它们的输出即可编写一次:

;WITH DataWithConditions AS
(
    SELECT
        T.Col1,
        T.Col2,
        T.Value1,
        T.Value2,
        Condition = CASE
            WHEN condition1 AND condition2 AND condition3 THEN 1
            WHEN condition4 AND condition5 AND condition6 THEN 2
            WHEN condition7 AND condition8 AND condition9 THEN 3 END
    FROM
        Table1 AS T
)
INSERT INTO #tTable (
    col1, 
    col2, 
    col3)
SELECT
    V.Col1,
    V.Col2,
    col3 = V.value1
FROM
    DataWithConditions AS V
WHERE
    V.Condition IN (1, 3)

UNION ALL

SELECT
    V.Col1,
    V.Col2,
    col3 = V.value2
FROM
    DataWithConditions AS V
WHERE
    V.Condition IN (2, 3)

【讨论】:

    【解决方案2】:

    您可以尝试 UNION ALL 将第二列的值合并为 ROW,如下所示-

    INSERT INTO #tTable (col1, col2, col3)
    
    SELECT T.col1, T.col2,
           CASE
               WHEN T.col1 > T.col2 THEN value1 -- Column name may be v1v2
               WHEN T.col1 = T.col2 THEN value1
               ELSE value2
           END
    FROM Table1 AS T
    
    UNION ALL
    
    SELECT T.col1, T.col2,value2 -- Value2 I guess the 2nd column
    FROM Table1 AS T WHERE  T.col1 > T.col2
    

    【讨论】:

    • 我的查询简化了太多。我用一个更真实的问题编辑了这个问题
    • 请从您的源表中输入一些示例日期,包括何时插入哪些数据的逻辑/案例。这会有所帮助。
    • 我不能透露数据,因为它是敏感数据。条件类似: col1 = 'string' col1 'string' col1 is not null col1 is null
    • 使用虚拟数据而不是真实数据。
    猜你喜欢
    • 2014-09-11
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多