2013-02-28 127 views
0

在case语句中执行此选择时收到上述错误。我尝试了几种方法,但无法获得正确的语法。ORA-00936:缺少表达式case语句

SELECT m.md_security_id, 
    thv.unit_qty, 
    thv.contract_value_amt, 
    thv.contract_currency_cd, 
    (case when 
    THV.BORROW_LOAN_TYPE_CD = 'B' 
    then select THV.SENDER_ORG_ID as BORROWER_ORG_ID, 
      select THV.RECIPIENT_ORG_ID as LENDER_ORG_ID 
    end), 
    (case when 
    THV.BORROW_LOAN_TYPE_CD = 'L' 
    THEN select THV.RECIPIENT_ORG_ID as BORROWER_ORG_ID, 
      select THV.SENDER_ORG_ID as LENDER_ORG_ID 
    end) 
    FROM eqmddev.txn_header_mv thv, 
    eqmddev.md_security m, 
    eqmddev.security_xref_vw_tbl x 
    WHERE  m.isin = x.security_id 
    AND ThV.SECURITY_MASTER_ID = X.SECURITY_MASTER_ID 
    AND M.EXCHANGE_CD = X.EXCHANGE_CD 
+1

您最好解释一下您想实现的目标。您当前的查询没有多大意义 – zerkms 2013-02-28 21:06:24

+1

同意。以为我知道你需要什么,直到我试图编辑它并修复它,然后意识到....有些东西丢失了。在你的情况下选择是一个问题;就我所知,您无法从案例中返回多列。 – 2013-02-28 21:09:35

+1

更多我看看它,为什么不完全跳过案例,并将borrower_org_id返回到下一列中的一列中,lender_org_id?看来你的布局在当前状态下非常令人困惑。 – 2013-02-28 21:12:15

回答

1

你需要重写查询是这样的:

SELECT m.md_security_id, 
    thv.unit_qty, 
    thv.contract_value_amt, 
    thv.contract_currency_cd, 
    case 
    when THV.BORROW_LOAN_TYPE_CD = 'B' then THV.SENDER_ORG_ID 
    when THV.BORROW_LOAN_TYPE_CD = 'L' THEN THV.RECIPIENT_ORG_ID 
    end AS BORROWER_ORG_ID, 
    case 
    when THV.BORROW_LOAN_TYPE_CD = 'B' then THV.RECIPIENT_ORG_ID 
    when THV.BORROW_LOAN_TYPE_CD = 'L' THEN THV.SENDER_ORG_ID 
    end AS LENDER_ORG_ID, 
FROM eqmddev.txn_header_mv thv, 
    eqmddev.md_security m, 
    eqmddev.security_xref_vw_tbl x 
WHERE  m.isin = x.security_id 
    AND ThV.SECURITY_MASTER_ID = X.SECURITY_MASTER_ID 
    AND M.EXCHANGE_CD = X.EXCHANGE_CD 

基本上,你不能从一个CASE语句返回多个列。将其视为单列的条件替换。在上面的示例中,我对BORROWER_ORG_IDLENDER_ORG_ID别名使用了相同的CASE条件。

在附注中,您还应该考虑在您的CASE中包含ELSE语句。否则,如果THV.BORROW_LOAN_TYPE_CD不是BL,您将获得NULL

+0

谢谢Cha !!!!完美的作品。我看到了一个例子,其结尾为,但没有意识到你在那里使用了别名。 – user2121274 2013-03-01 14:55:14