我很好奇为什么我似乎无法让条件语句遵循 t-SQL 语句中的公用表表达式?
像这样的东西:
WITH ctx AS(...)
IF ctx.v BEGIN
INSERT INTO ...
END
我在这里做了一个样品小提琴。
我很好奇为什么我似乎无法让条件语句遵循 t-SQL 语句中的公用表表达式?
像这样的东西:
WITH ctx AS(...)
IF ctx.v BEGIN
INSERT INTO ...
END
我在这里做了一个样品小提琴。
公共表表达式基本上只是一个可以在多个 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