在t-SQL中遵循CTE子句的条件INSERT

时间:2012-07-25 23:47:20

标签: sql sql-server tsql insert common-table-expression

我很好奇为什么我似乎无法在t-SQL语句中获得跟随公用表表达式的条件语句?

这样的东西:

WITH ctx AS(...)
IF ctx.v BEGIN
INSERT INTO ...
END

我做了sample fiddle here

1 个答案:

答案 0 :(得分:3)

公用表表达式基本上只是一个可以在多个SQL语句中重用的子查询。所以,无论如何你都需要从中选择;你不能只是引用它,就像它是一个变量。可以把它想象成一个临时表。

您应该能够通过将条件添加为where子句来实现您想要的目标。

WITH ctx AS(
   SELECT MIN(t1.dtIn) AS mdIn, MAX(t1.dtOut) AS mdOut FROM tbl t1
      INNER JOIN tbl t2
      ON t1.Type = t2.Type
        AND t1.dtIn < t2.dtOut 
        AND t1.dtOut > t2.dtIn
      WHERE t1.type = 1
)

INSERT INTO tbl (id, dtIn, dtOut, type)
SELECT 10, 
       CASE WHEN mdOut IS NOT NULL AND 
                 mdOut > '0:30' AND
                 '0:40' >= mdOut THEN mdOut
       ELSE '0:30' END,
       CASE WHEN mdIn IS NOT NULL AND
                 mdIn < '0:40' AND
                 '0:30' >= mdIn THEN mdIn
       ELSE '0:40' END,
1
FROM ctx
where ctx.mdIn < '0:40' AND ctx.mdOut > '0:30'

select * from tbl