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

时间:2018-09-26 16:20:58

标签: sql sql-insert

我正在转换表中的数据,然后将其插入到新表中。我不希望新表包含转换中的某些值,那么是否存在执行以下操作的适当方法?

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 个答案:

答案 0 :(得分:2)

在这种情况下,我将使用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'; 

答案 1 :(得分:1)

您可以嵌套<script src="https://jqwidgets.com/public/jqwidgets/jqx-all.js"></script> <link href="https://jqwidgets.com/public/jqwidgets/styles/jqx.base.css" rel="stylesheet"/> <div id="grid"> </div>来避免两次调用select

func_doTransformation

答案 2 :(得分:1)

在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和子查询。