Есть ли лучший способ отфильтровать преобразованные строки в инструкции INSERT? - PullRequest
0 голосов
/ 26 сентября 2018

Я преобразую данные в таблицу, а затем вставляю это преобразование в новую таблицу.Я не хочу, чтобы новая таблица содержала определенные значения из преобразования, поэтому есть ли правильный способ сделать следующее?

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 голосов
/ 26 сентября 2018

Я бы использовал 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'; 
0 голосов
/ 26 сентября 2018

В 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, так и подзапросы.

0 голосов
/ 26 сентября 2018

Вы можете вкладывать select s, чтобы не вызывать func_doTransformation дважды:

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