You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle CASE语句报ORA-00923错误,SQL Dev正常但代码调用失败

ORA-00923错误:NHibernate Formula中Oracle查询的别名问题

我编写了如下Oracle查询语句:

SELECT
  CASE WHEN P.ORGINAL_PROSJEKT_K IS NULL
  THEN RAD_LAGER
  ELSE (
    SELECT PO.RAD_LAGER
    FROM PROSJEKT PO
    WHERE PO.PROSJEKT_K = P.ORGINAL_PROSJEKT_K
  ) END AS RAD_LAGER_ORIGINAL
  FROM PROSJEKT P
  WHERE P.PROSJEKT_K = PROSJEKT_K;

这条语句在SQL Developer中可正常执行,但通过C#代码调用时触发InnerException: ORA-00923 FROM keyword not found where expected错误。我尝试过给别名RAD_LAGER_ORIGINAL加引号、修改别名不含下划线,但均无效。

我使用NHibernate进行映射,相关代码如下:

Map(x => x.ProsjektLagetAv).Formula(@"(SELECT CASE WHEN P.ORGINAL_PROSJEKT_K IS NULL THEN RAD_LAGER ELSE (SELECT PO.RAD_LAGER FROM PROSJEKT PO WHERE PO.PROSJEKT_K = P.ORGINAL_PROSJEKT_K) END AS RAD_LAGER_ORIGINAL FROM PROSJEKT P WHERE P.PROSJEKT_K = PROSJEKT_K)");

实体构造代码:

[DataMember]
public virtual string ProsjektLagetAv { get; set; }
// PROSJEKT_K参数始终已提供且不为空。

Map(x => x.ProsjektK, "PROSJEKT_K");
[DataMember]
public virtual string ProsjektK { get; set; }

解决方法

NHibernate在映射时存在特殊处理,无法识别带别名的子查询结构,移除别名AS RAD_LAGER_ORIGINAL后问题解决,修改后的查询语句如下:

SELECT
  CASE WHEN P.ORGINAL_PROSJEKT_K IS NULL
  THEN RAD_LAGER
  ELSE (
    SELECT PO.RAD_LAGER
    FROM PROSJEKT PO
    WHERE PO.PROSJEKT_K = P.ORGINAL_PROSJEKT_K
  ) END
  FROM PROSJEKT P
  WHERE P.PROSJEKT_K = PROSJEKT_K;

内容的提问来源于stack exchange,提问作者s1dda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:15:41