“Where”表达式中的列名无效

时间:2012-01-19 23:18:09

标签: c# sql-server sql-server-2008

我发现这个SQL函数遍历表并且它找到 ParentID 代码工作,除非我在其中放置where子句时对新创建的列不起作用。如果我不使用where子句,它会生成 Expr1 作为树的根,这就是我想要的但是我不能在它上面添加条件。

有人可以帮我解决这个问题吗?

ALTER FUNCTION dbo.fn_Root
(
    @PostID int
)
RETURNS int
AS 
BEGIN
DECLARE @R int

SELECT @R = CASE WHEN ParentPostID = 0 THEN PostID
                ELSE dbo.fn_Root(ParentPostID)
            END
        FROM Post
        WHERE PostID = @PostID

RETURN @R
END


SELECT PostID, Title, dbo.fn_Root(PostID) AS Expr1
FROM Post WHERE Expr1 = 5

2 个答案:

答案 0 :(得分:3)

您无法直接在SQL Server的WHERE子句中引用计算/计算列别名。但是,一个简单的解决方法是包装语句并将WHERE子句置于外部,引用计算列:

SELECT * FROM (
    SELECT PostID, Title, dbo.fn_Root(PostID) AS Expr1
    FROM Post)
WHERE Expr1 = 5

答案 1 :(得分:2)

另一种可能的解决方法:您可以将计算值再次放入WHERE子句中:

SELECT PostID, Title, dbo.fn_Root(PostID) AS Expr1
FROM Post 
WHERE dbo.fn_Root(PostID) = 5