Tsql 如何在WHERE子句中使用CASE别名?

Tsql 如何在WHERE子句中使用CASE别名?,tsql,case,where,clause,Tsql,Case,Where,Clause,我试图将“val”放入where子句,但它返回错误: Select ff.FormID, ff.FieldID, ff.FieldName, ff.Title, ff.DefaultValue, fv.Value, val = case fv.Value when null then cast(ff.DefaultValue as nvarchar) else fv.Value end, ff.DataType from (SELECT FormID,

我试图将“val”放入where子句,但它返回错误:

    Select ff.FormID, ff.FieldID, ff.FieldName, ff.Title, 
    ff.DefaultValue, fv.Value, 
    val = case fv.Value when null then cast(ff.DefaultValue as nvarchar) else fv.Value end,
    ff.DataType from
    (SELECT FormID, FieldID, FieldName, Title, DataType, DefaultValue FROM FormFields where FormID = '766A38D8-8058-42C6-AC46-A18C00D3C1DC' and DEL = 0) as ff
    left join
    (select FormID, FieldID, Value from FormValues where FormID = '766A38D8-8058-42C6-AC46-A18C00D3C1DC' and ItemID = 'FD63CCA2-C95F-4AB4-B84B-A220017027E7' and DEL = 0) as fv
    on ff.FormID = fv.FormID and ff.FieldID = fv.FieldID
where val is not null


Msg 207, Level 16, State 1, Line 9
Invalid column name 'val'.

感谢任何帮助:)

不允许在where子句(sql server中)中使用别名,因为查询的逻辑执行顺序如下:

  • 加入
  • 在哪里
  • 分组
  • 使用多维数据集还是使用汇总
  • 拥有
  • 挑选
  • 明显的
  • 订购人
  • 正如您所看到的,在
    SELECT
    之前执行
    子句的位置,这就是为什么您不能引用
    SELECT
    子句中的别名

    尝试:


    如果要执行此操作,则需要使用子查询并将where子句放置在子查询之外,或者必须在where中重述大小写表达式。除非这是一个子查询并且您正在从中选择,否则您不能在其中引用别名。相反,您可以在where子句中使用
    val
    中的case语句。它可能看起来很凌乱,但它确实起到了作用。请参阅“语句的逻辑处理顺序”<代码>其中
    是步骤4。和“因为SELECT子句是步骤8,所以前面的子句不能引用该子句中定义的任何列别名或派生列”
    Select ff.FormID, ff.FieldID, ff.FieldName, ff.Title, 
    ff.DefaultValue, fv.Value, 
    val = case fv.Value when null then cast(ff.DefaultValue as nvarchar) else fv.Value end,
    ff.DataType from
    (SELECT FormID, FieldID, FieldName, Title, DataType, DefaultValue FROM FormFields where FormID = '766A38D8-8058-42C6-AC46-A18C00D3C1DC' and DEL = 0) as ff
    left join
    (select FormID, FieldID, Value from FormValues where FormID = '766A38D8-8058-42C6-AC46-A18C00D3C1DC' and ItemID = 'FD63CCA2-C95F-4AB4-B84B-A220017027E7' and DEL = 0) as fv
    on ff.FormID = fv.FormID and ff.FieldID = fv.FieldID
    where case fv.Value when null then cast(ff.DefaultValue as nvarchar) else fv.Value end is not null