代码之家  ›  专栏  ›  技术社区  ›  moswald Jarod42

有没有更好的方法来过滤INSERT语句中经过转换的行?

  •  1
  • moswald Jarod42  · 技术社区  · 7 年前

    INSERT INTO #transformed (NewValue)
    SELECT func_doTransformation(ot.OldValue)
    FROM   OriginalTable ot
    WHERE  func_doTransformation(ot.OldValue) <> 'bad data'
    

    我考虑过做一个 INSERT ... 接着是一个 DELETE ... WHERE ,但这似乎比打电话效率略低 func_doTransformation

    3 回复  |  直到 7 年前
        1
  •  2
  •   Stephen Wrighton    7 年前

    我会在这个场景中使用CTE。

    ; WITH cte AS (SELECT Val = func_doTransformation(ot.OldValue) FROM OriginalTable ot) 
    
    INSERT INTO #transformed (NewValue)
     SELECT Val FROM cte WHERE Val <> 'Bad Data'; 
    
        2
  •  1
  •   Sergey Kalinichenko    7 年前

    select func_doTransformation

    INSERT INTO #transformed (NewValue)
    SELECT * FROM (
        SELECT func_doTransformation(ot.OldValue) as NewValue
        FROM   OriginalTable ot
    ) x
    WHERE  x.NewValue <> 'bad data'
    
        3
  •  1
  •   Gordon Linoff    7 年前

    在SQL Server中,可以使用 apply 为函数结果指定名称:

    INSERT INTO #transformed (NewValue)
        SELECT v.newValue
        FROM OriginalTable ot CROSS APPLY
             (VALUES (func_doTransformation(ot.OldValue))) v(newValue)
        WHERE v.newValue <> 'bad data';
    

    当然,CTE和子查询也可以使用。