1

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

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

我考虑过先做 a ,INSERT ...然后再做 a DELETE ... WHERE,但这似乎只比调用func_doTransformation两次效率低一点。

4

3 回答 3

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'; 
于 2018-09-26T16:24:08.240 回答
1

您可以嵌套selects 以避免调用func_doTransformation两次:

INSERT INTO #transformed (NewValue)
SELECT * FROM (
    SELECT func_doTransformation(ot.OldValue) as NewValue
    FROM   OriginalTable ot
) x
WHERE  x.NewValue <> 'bad data'
于 2018-09-26T16:23:51.273 回答
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 和子查询。

于 2018-09-26T16:24:58.270 回答